Java-队列

52次阅读

共计 950 个字符,预计需要花费 3 分钟才能阅读完成。

引言

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

看了看 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 包下,也就是阻塞队列,以后再完善。

正文完
 0