目录
- 一、队列与双端队列
- 二、Queue和Deque
- 三、api对比
- 1、add和offer区别
- 2、remove和poll
- 3、element和peek
- 四、优先队列
- 1、PriorityQueue常用方法
- 2、ArrayDeque常用方法
大家好,我是哪吒。
一、队列与双端队列
双端队列是一种特殊的队列,它的两端都可以进行插入和删除操作。这种队列的实现方式是使用两个指针,一个指针指向队列的头部,另一个指针指向队列的尾部。当需要插入或删除元素时,只需要移动指针即可。
双端队列的主要优点是可以在队列的两端进行操作,因此具有较高的效率。此外,双端队列还具有一些其他的优点,例如可以在队列的两端进行查询操作,因此具有较高的查询效率。
双端队列的缺点是插入和删除操作的时间复杂度都是O(1),因此在处理大量数据时可能会导致性能问题。此外,双端队列的空间复杂度也是O(1),因此在插入和删除元素时需要使用额外的空间。
二、Queue和Deque
Queue以及Deque都是继承于Collection,Deque是Queue的子接口。
Queue是FIFO的单向队列,Deque是双向队列。
Queue有一个直接子类PriorityQueue,而Deque中直接子类有两个:LinkedList以及ArrayDeque。
PriorityQueue的底层数据结构是数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的。
ArrayDeque是无初始容量的双端队列,LinkedList则是双向链表。
PriorityQueue可以作为堆使用,而且可以根据传入的Comparator实现大小的调整,会是一个很好的选择。
ArrayDeque通常作为栈或队列使用,但是栈的效率不如LinkedList高。
LinkedList通常作为栈或队列使用,但是队列的效率不如ArrayQueue高。
三、api对比
1、add和offer区别
- add() : 添加元素,如果添加成功则返回true,如果队列是满的,则抛出异常;
- offer() : 添加元素,如果添加成功则返回true,如果队列是满的,则返回false;
2、remove和poll
- remove() : 移除队列头的元素并且返回,如果队列为空则抛出异常;
- poll() : 移除队列头的元素并且返回,如果队列为空则返回null;
Deque新增了一个pop方法,也是移除队列头的元素并且返回,如果队列为空则抛出异常。
3、element和peek
- element() :返回队列头元素但不移除,如果队列为空,则抛出异常;
- peek() :返回队列头元素但不移除,如果队列为空,则返回null;
因此,增加推荐使用offer,移除推荐使用poll,获取元素推荐使用peek。
四、优先队列
优先队列中的元素可以按照任意的顺序插入,但会按照有序的顺序获取。
优先队列常用结构是PriorityQueue和ArrayDeque。
也就是在调用remove时,总是删除队列中最小的元素。
优先队列使用堆作为存储数据结构,堆是一个自组织的二叉树,其添加和删除操作会让最小的元素移动到根,而不必花费时间对元素进行排序。
优先队列的主要用途是调度。每个任务有一个优先级,任务以随机顺序插入到队列中,每当启动一个新的任务时,将从队列中删除优先级最高的任务。
1、PriorityQueue常用方法
PriorityQueue是一个基于优先级的无界优先队列,它的元素按照元素的优先级进行排序。
- offer(Object obj):将一个对象添加到PriorityQueue的头部;
- poll():从PriorityQueue的头部移除一个对象;
- peek():返回PriorityQueue的头部元素,但不移除它;
- element():返回PriorityQueue的头部元素,并移除它;
- isEmpty():判断PriorityQueue是否为空;
2、ArrayDeque常用方法
ArrayDeque是一个基于数组的有界优先队列,它的元素按照元素的插入顺序进行排序。
- offer(Object obj):将一个对象添加到ArrayDeque的头部;
- pollLast():返回ArrayDeque的尾部元素,但不移除它;
- pollFirst():返回ArrayDeque的头部元素,但不移除它;
- peekLast():返回ArrayDeque的尾部元素,但不移除它;
- peekFirst():返回ArrayDeque的头部元素,但不移除它;
- isEmpty():判断ArrayDeque是否为空。
🏆本文收录于,49天精通Java从入门到就业。
全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。
🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。