乐趣区

Java-队列

引言

本周在编写短信验证码频率限制切面的时候,经潘老师给的实现思路,使用队列进行实现。

看了看 java.util 包下的 Queue 接口,发现还从来没用过呢!

Collection集合类接口,由它派生出 ListSetQueueMap属于另一个独立的接口,和 Collection 没有继承关系。

ListSetMap 我们用的都是已经相当熟练了,今天,我们就来盘这个队列Queue

探索

队列与栈都是数据结构的基础话题,队列:先进先出;栈:后进先出。

方法

Queue接口中声明了六个方法,分成三对来使用。

入队操作

方法 特点 建议
add 入队失败抛出异常
offer 入队失败返回false 推荐

出队操作

方法 特点 建议
remove 出队失败抛出异常
poll 出队失败返回null 推荐

取队头操作

方法 特点 建议
element 队列为空时抛出异常
peek 队列为空时返回null 推荐

PriorityQueue

java.util 包中,除抽象类外,直接实现 Queue 接口的只有 PriorityQueue 优先级队列。

优先级队列比普通的队列要高级,普通的队列如果是先进的肯定是在队头的,而优先级队列根据优先级判断当前队头元素是什么。很适合实现操作系统中的按优先级实现进程调度。

如果需要使用优先级队列进行排序时,需要传入比较器。

该队列使用数组实现,线程不安全。

Deque

java.util包中,Deque接口继承 Queue 接口。

Dequedouble-ended queue,双端队列。

双端队列,相比普通队列就是可操作两端,有两个队头,也有两个队尾。

所以再去看 Deque 接口中声明的方法,都是两套的。offerFirstofferLastpollFirstpollLast等。

所以说,如果使用双端队列,不仅可以当队列用,也可以当栈用,因为可以自己控制出的是队头还是队尾。

Deque有两个实现类:ArrayDequeLinkedList

原来 LinkedList 不仅实现了 List 接口,还实现了 Deque 接口。

两者的区别显而易见,一个是数组方式实现的,一个是链表的方式实现的。

TODO

这些都是 java.util 包下的,都是线程不安全的实现,JDK所有线程安全的队列实现都在 java.util.concurrent 包下,也就是阻塞队列,以后再完善。

退出移动版