queue作为队列,java在实现的时候,直接实现了双端队列deque。这样双端队列就囊括了队列、双端队列、堆栈这3种角色的功能。
所以我们在使用的时候使用的是Deque接口的实现类,当然Deque接口继承自Queue接口。
Deque接口的实现类
我们记住,Deque接口所能代表的数据结构:队列,双端队列,堆栈。
ArrayDeque
1.内部使用transient Object[] elements
数组来实现。拥有head/tail
这2个头尾指针。最小初始化容量8。它还是一个循环队列。
2.在扩容/初始化的时候,数组的内部大小一定是2个幂次方,也就是说大小只可能是:8、16、32、64这样的倍增。
3.它作为堆栈、队列、双端队列的操作和LinkedList的操作是一致的,只是内部的实现不同。当然,它们也有区别。
ArrayDeque实现了双端队列,内部使用循环数组实现,这决定了它有如下特点:
- 在两端添加、删除元素的效率很高,动态扩展需要的内存分配以及数组拷贝开销可以被平摊,具体来说,添加N个元素的效率为O(N)。
- 根据元素内容查找和删除的效率比较低,为O(N)。
- 与ArrayList和LinkedList不同,没有索引位置的概念,不能根据索引位置进行操作(无法随机访问,这也符合队列的性质)。
4.操作示例
LinkedList
LinkedList的Deque性质在“List有序集合”中讲解了一遍。
ArrayDeque和LinkedList的比较
ArrayDeque和LinkedList都实现了Deque接口,应该用哪一个呢?如果只需要Deque接口,从两端进行操作,一般而言,ArrayDeque效率更高一些,应该被优先使用,不过,如果同时需要根据索引位置进行操作,或者经常需要在中间进行插入和删除,则应该选LinkedList(这里使用的是List特性,而不是Deque特性了)。