共计 950 个字符,预计需要花费 3 分钟才能阅读完成。
引言
本周在编写短信验证码频率限制切面的时候,经潘老师给的实现思路,使用队列进行实现。
看了看 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
包下,也就是阻塞队列,以后再完善。