图解ArrayDeque

ArrayDeque 既可实现普通队列 FIFO 先进先出,也可实现栈的先进后出功能

一.ArrayDeque的特点

  • 底层通过循环数组实现 俩个重要属性 head tail
  • 不能添加null值,不然会报空指针
  • 每次扩容都是2的n次方
  • 可以实现普通队列先进先出排序,也可以实现栈先进后出的排序
  • 特别留意,它里面通过二进制方式判断数组是否已满
    (tail = (tail + 1) & (elements.length - 1)) == head

二.ArrayList的实现

其实ArrayDeque也就是我们在做算法时做到的入门题,用数组实现队列和实现栈,它主要就是用两个指针去实现,一个指针为head,一个指针为tail。

 

 

 但是这种方式就会出现一种空间浪费,当我们加了几个数据之后,tail会++,再弹出数据时,前面的空间就会浪费,这时我们把整个数据抽象成循环数据,理论上它的形状就是

 

 

 但是我们在真正在实现的时候就是tail会判断是否越界,如果越界就跑到另一端,head也是如此。它真正实现的图应该是这样的

 

           图来自https://www.jianshu.com/p/132733115f95

jdk源码里面,通过 (tail = (tail + 1) & (elements.length - 1)) == head 来判断数组已满 ,并且要求数组每次扩容的长度为2的n次方来使得上面的等式有效;

 

三.add和delete

在ArrayDeque中的add是比较简单的,在delete中涉及到数组的批量移动,在这里是有点东西的。因为它底层是使用数组实现的,所以还是避免不了删除时的消耗,但是ArrayDeque把这种消耗降低了,ArrayDeque的方法就是移动尽量少的数据,先判断中间元素里head近还是离tail近,然后移动较近的那一端。不过,较近的一端只是逻辑上较近,物理数组上,可能被分成了两截,这就需要做两次数组元素的批量移动。

posted @ 2020-10-27 19:53  拿着放大镜看世界  阅读(344)  评论(0编辑  收藏  举报