Java集合框架源码研读-ArrayDeque

前面介绍过一个队列的实现-PriorityQueue,现在我们介绍一下ArrayDeque.

从它的名字中,我们可以看到,其内部结构是一个数组,并且它是一个Deque.

我们首先看一下这个类的文档注释:

从中我们可以提取出来几点重要信息:

  • 内部数组的容量会自动增加,如果必要的话
  • 这个类不是线程安全的
  • 这个类是Fail-Fast的
  • 如果把它当做栈来使用,那么它比Stack这个数据结构更快(这点我也不知道是什么原因,我感觉它应该比Stack慢.因为Stack只需要在栈顶增加和删除数据,时间复杂度均为O(1),而ArrayDeque在删除数据时由于还要涉及到数据移动的问题,所以即使单纯的增加和删除数据的时间复杂度为O(1),但是再加上数据移动的开销,其不是应该比Stack慢吗?)
  • 如果把它当做队列来使用,那么它比LinkedList更快(这点也不理解,因为LinkedList中有一个指向链表末尾的指针,并且每个节点都有指向前一个节点的指针,那么在插入数据时时间复杂度也为O(1)啊)
  • 它的所有操作的时间复杂度基本上都是O(1),除了一些需要通过遍历找到数据位置的操作,比如remove(Object), removeFirstOccurence(Object), removeLastOccurrence(Object), contains(Object)等.

ArrayDeque的内部数据结构

其内部数据容器为一个数组, Object[] elements.

然后还有两个属性,headtail,分别表示elements中,第一个数据所在的位置以及最后一个数据所在的位置.

ArrayDeque的重要操作

ArrayDeque中,有这么两个方法,用于扩容:

这一个方法用于将容量扩展两倍并拷贝数据.

这个方法用于找到跟numElements接近但是比它大的2的整数次幂.如果numElements已经是2的整数次幂,则取它的两倍.

其他的方法就很简单了.就是向队首和队尾插入删除数据的一些方法.这里就不一一介绍了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天我们来介绍下集合Queue中的几个重要的实现类。关于集合Queue中的内容就比较少了。主要是针对队列这种数据结...
    Ruheng阅读 12,738评论 4 27
  • 本文取自工匠若水的qq群里的Java基础题目,把里面有关Java集合放在一起。全文github地址 35.Arra...
    蝉翅的空响阅读 1,760评论 0 0
  • 在经过一次没有准备的面试后,发现自己虽然写了两年的android代码,基础知识却忘的差不多了。这是程序员的大忌,没...
    猿来如痴阅读 8,059评论 3 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,086评论 18 399
  • 1.咖啡冥想是最快的让种子开花结果的方式 就像母鸡孵蛋一样的照顾好自己的好种子,给她最适宜的温度 如果有其它动物来...
    柔光宝宝阅读 1,229评论 0 0

友情链接更多精彩内容