Queue
1 | public interface Queue<E> extends Collection<E> |
- 作为队列,不一定是
FIFO
,也可作为优先级队列、LIFO
堆栈 - 没有定义阻塞队列方法,由
BlockingQueue
接口定义 - 通常不允许
null
元素,尽管一些实现如LinkedList
不禁止,null
会作为poll()
的返回值 不实现
equals
和hashCode
方法,相同元素排序属性可能不同失败操作:
抛出异常 | 返回特定值( null 或false ) |
|
---|---|---|
Insert | add(e) |
offer(e) |
Remove | remove() |
poll() |
Examine | element() |
peek() |
Deque
1 | public interface Deque<E> extends Queue<E> |
- 双端队列
- 不支持索引访问
- 定义了访问
deque
两端元素的方法。 提供了插入,移除和检查元素的方法,总结如下:
First Element (Head) | Last Element (Tail) | |||
---|---|---|---|---|
Throws exception | Special value | Throws exception | Special value | |
Insert | addFirst(e) |
offerFirst(e) |
addLast(e) |
offerLast(e) |
Remove | removeFirst() |
pollFirst() |
removeLast() |
pollLast() |
Examine | getFirst() |
peekFirst() |
getLast() |
peekLast() |
- 作为FIFO队列,和queue方法对比:
Queue Method | Equivalent Deque Method |
---|---|
add(e) |
addLast(e) |
offer(e) |
offerLast(e) |
remove() |
removeFirst() |
poll() |
pollFirst() |
element() |
getFirst() |
peek() |
peekFirst() |
- 作为LIFO,和Stack方法对比
Stack Method | Equivalent Deque Method |
---|---|
push(e) |
addFirst(e) |
pop() |
removeFirst() |
peek() |
peekFirst() |
ArrayDeque
1 | public class ArrayDeque<E> extends AbstractCollection<E> |
特点
- 可调整大小的数组实现,非线程安全
- 不允许空元素
- 作为栈,速度比
Stack
快;作为队列,速度比LinkedList
快 - 迭代器是fast-fail的
- 头指针head从内部数组的末尾开始,尾指针tail从0开始,在头部插入数据时,head减一,在尾部插入数据时,tail加一。当head==tail时说明数组的容量满足不了当前的情况,此时需要扩大容量为原来的二倍。
- 核心思想图:
源码分析
构造函数
1 | //未指定容量时,默认为16 |
成员变量
1 | //实际存放元素的数组 |
核心方法
- 扩容
1 | private void doubleCapacity() { |
- 插入
1 | //在头部插入数据 |
- 删除
1 | //删除头部数据 |
- 遍历
1 | public Iterator<E> iterator() { |
PriorityQueue
1 | public class PriorityQueue<E> extends AbstractQueue<E> |
特点
无界队列,最小二叉堆的实现
不允许空元素
迭代器
iterator()
不能保证以特定顺序遍历优先级队列,需要有序用Arrays.sort(pq.toArray())
入列、出列方法,
offer()
、add()
、poll()
、remove()
的时间复杂度为O(log(n))
;检索方法,
peek()
、element()
和size()
方法的时间复杂度为O(1)
;remove(Object)
和contains(Object)
方法时间复杂度为线性,O(n)
;非线程安全,需要线程安全使用
PriorityBlockingQueue
不指定容量,则
DEFAULT_INITIAL_CAPACITY = 11
源码分析
成员变量
1 | //queue[n] 子节点为 queue[2*n+1] , queue[2*(n+1)] |
核心方法
- 构建堆操作
1 | //构建堆 |
- offer()
1 | public boolean offer(E e) { |
- poll()
1 | public E poll() { |
- iterator()
iterator只会将元素顺次输出一遍,元素第一位一定是最小元素,并且整体满足堆特性,但是整体并不是严格的从小到大排列。堆只是整体有序,并不是完全有序。
参考
https://blog.csdn.net/lh513828570/article/details/59560771