本周在编写短信验证码频率限制切面的时候,经潘老师给的实现思路,使用队列进行实现。
看了看 java.util
包下的 Queue
接口,发现还从来没用过呢!
Collection
集合类接口,由它派生出 List
、 Set
和 Queue
, Map
属于另一个独立的接口,和 Collection
没有继承关系。
List
、 Set
和 Map
我们用的都是已经相当熟练了,今天,我们就来盘这个队列 Queue
!
队列与栈都是数据结构的基础话题,队列:先进先出;栈:后进先出。
Queue
接口中声明了六个方法,分成三对来使用。
方法 | 特点 | 建议 |
---|---|---|
add | 入队失败抛出异常 | |
offer | 入队失败返回 false |
推荐 |
方法 | 特点 | 建议 |
---|---|---|
remove | 出队失败抛出异常 | |
poll | 出队失败返回 null |
推荐 |
方法 | 特点 | 建议 |
---|---|---|
element | 队列为空时抛出异常 | |
peek | 队列为空时返回 null |
推荐 |
PriorityQueue
在 java.util
包中,除抽象类外,直接实现 Queue
接口的只有 PriorityQueue
优先级队列。
优先级队列比普通的队列要高级,普通的队列如果是先进的肯定是在队头的,而优先级队列根据优先级判断当前队头元素是什么。很适合实现操作系统中的按优先级实现进程调度。
如果需要使用优先级队列进行排序时,需要传入比较器。
该队列使用数组实现,线程不安全。
Deque
java.util
包中, Deque
接口继承 Queue
接口。
Deque
: double-ended queue
,双端队列。
双端队列,相比普通队列就是可操作两端,有两个队头,也有两个队尾。
所以再去看 Deque
接口中声明的方法,都是两套的。 offerFirst
、 offerLast
、 pollFirst
、 pollLast
等。
所以说,如果使用双端队列,不仅可以当队列用,也可以当栈用,因为可以自己控制出的是队头还是队尾。
Deque
有两个实现类: ArrayDeque
和 LinkedList
。
原来 LinkedList
不仅实现了 List
接口,还实现了 Deque
接口。
两者的区别显而易见,一个是数组方式实现的,一个是链表的方式实现的。
TODO
这些都是 java.util
包下的,都是线程不安全的实现, JDK
所有线程安全的队列实现都在 java.util.concurrent
包下,也就是阻塞队列,以后再完善。