本周在编写短信验证码频率限制切面的时候,经潘老师给的实现思路,使用队列进行实现。
看了看 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 包下,也就是阻塞队列,以后再完善。