Queue接口的实现类

queue作为队列,java在实现的时候,直接实现了双端队列deque。这样双端队列就囊括了队列、双端队列、堆栈这3种角色的功能。

所以我们在使用的时候使用的是Deque接口的实现类,当然Deque接口继承自Queue接口。

queue-1

Deque接口的实现类

我们记住,Deque接口所能代表的数据结构:队列,双端队列,堆栈。

ArrayDeque

1.内部使用transient Object[] elements数组来实现。拥有head/tail这2个头尾指针。最小初始化容量8。它还是一个循环队列。

queue-2

2.在扩容/初始化的时候,数组的内部大小一定是2个幂次方,也就是说大小只可能是:8、16、32、64这样的倍增。

queue-3

queue-4

3.它作为堆栈、队列、双端队列的操作和LinkedList的操作是一致的,只是内部的实现不同。当然,它们也有区别。

ArrayDeque实现了双端队列,内部使用循环数组实现,这决定了它有如下特点:

  • 在两端添加、删除元素的效率很高,动态扩展需要的内存分配以及数组拷贝开销可以被平摊,具体来说,添加N个元素的效率为O(N)。
  • 根据元素内容查找和删除的效率比较低,为O(N)。
  • 与ArrayList和LinkedList不同,没有索引位置的概念,不能根据索引位置进行操作(无法随机访问,这也符合队列的性质)。

4.操作示例

queue-5

queue-6

LinkedList

LinkedList的Deque性质在“List有序集合”中讲解了一遍。

ArrayDeque和LinkedList的比较

ArrayDeque和LinkedList都实现了Deque接口,应该用哪一个呢?如果只需要Deque接口,从两端进行操作,一般而言,ArrayDeque效率更高一些,应该被优先使用,不过,如果同时需要根据索引位置进行操作,或者经常需要在中间进行插入和删除,则应该选LinkedList(这里使用的是List特性,而不是Deque特性了)。

最近的文章

二叉树

前情提要:1、二叉树每一个节点最多有2个子节点,有左右之分。深度为n的二叉树,最多有2^n^ -1个节点,第n层最多有2^k-1^ 个节点。 2、满二叉树一棵深度为k,且有2^k^ -1个节点的树。 3、完全二叉树完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个 …

二叉树, 算法 继续阅读
更早的文章

tomcat与nginx反向代理

一、在linux上部署运行多个tomcat1、以前的我们虽然说是在linux上,但是windows上也是同样的道理,只不过我们服务器都是选用linux罢了。 原先,自己有多个项目需要部署在linux上时,我的做法(新手的做法)是:在linux上只有一个tomcat服务器,我们把多个项目如projec …

nginx, tomcat 继续阅读