美文网首页
ArrayDeque

ArrayDeque

作者: pdog18 | 来源:发表于2017-10-23 09:50 被阅读16次

双端队列,在OkHttp#Dispatcher有用到

感谢xiaoshua ArrayDeque源码分析

一 构造

这个数据结构有两个构造,默认的容积(capacity)8,而通过构造参数传入的并不是简单的按照传入值来确定容积(capacity)

最后的容积总是为2 的 n次方,8 <capacity < 2^31 ,这样做的好处可以方便elements - 1用作&运算符加快运算

二 添加元素

举例一个容积为8ArrayDeque,添加元素时的位置

  • addFirst()

    8 > 7 > 6 > 5 > 4 > ...

  • addLast()

    0 > 1 > 2 > 3 > 4 > ...

同时,如果头(head)(tail)相等时,

private void doubleCapacity() {
   assert head == tail;
   int p = head;
   int n = elements.length;
   int r = n - p; // number of elements to the right of p
   int newCapacity = n << 1;
   if (newCapacity < 0)
       throw new IllegalStateException("Sorry, deque too big");
   Object[] a = new Object[newCapacity];
   System.arraycopy(elements, p, a, 0, r);
   System.arraycopy(elements, 0, a, r, p);
   elements = a;
   head = 0;
   tail = n;
}

会创建一个双倍的数组,然后使用System.arraycopy 两次将旧的数组中的元素复制到新数组中,第一次拷贝右边的(head - elements.length],第二次拷贝左边的(0 - head],然后将head置为0,tail置为原数组的长度

addFirst(e)中的elements[head = (head - 1) & (elements.length - 1)] = e; 的作用

int a = -1;
int mod = 16;
if (a == -1){
  System.out.println("a == -1 ---------------");
  System.out.println(a & (mod - 1));
  System.out.println(mod - 1);
}

a = 14;
if (-1 < a  && a < mod){
  System.out.println("-1 < a  && a < mod ---------------");
  System.out.println(a & (mod - 1));
  System.out.println(a);
}

a = 16;
if (a == mod){
  System.out.println("a == mod ---------------");
  System.out.println(a & (mod - 1));
  System.out.println(0);
}

输出

a == -1 ---------------
15
15
-1 < a && a < mod ---------------
14
14
a == mod ---------------
0
0

也就是说,如果 head = 0 的时候,那么在存放新元素(指addFirst)的索引为elements.length -1 ,而其他时候存放新元素的索引为head - 1,

如果 head = elements.length - 1 的时,进行取值操作, 取值后 head 会成为0

相关文章

  • ArrayDeque

    ArrayDeque 原文见Java 容器源码分析之 Deque 与 ArrayDeque。 概述 ArrayDe...

  • 源码的魅力 - ArrayDeque 的工作原理

    ArrayDeque 的工作原理(Android 7.1源码) 简介 ArrayDeque 是以循环数组形式实现的...

  • ArrayDeque:LinkedList

    ArrayDeque和LinkedList都实现了Deque双端队,从两端取值/添加/删除. ArrayDeque...

  • Java ArrayDeque 原理之循环数组

    问:谈谈你对 ArrayDeque 主要方法实现原理的认识? 答:即循环数组的实现原理。 从 ArrayDeque...

  • 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安...

  • Java双端队列-ArrayDeque的使用

    1、概览 本篇,我们将介绍ArrayDeque的使用方法-ArrayDeque是Deque的一个实现。ArrayD...

  • ArrayDeque

    队列方法基础说明见队列接口设计 一 ArrayDeque中操使用了各种位操作,先对位运算进行说明 二进制数表示二进...

  • ArrayDeque

    双端队列,在OkHttp#Dispatcher有用到 感谢xiaoshua ArrayDeque源码分析 一 构...

  • ArrayDeque

    几句话证明你看过ArrayDeque的源码Deque: double ended queue,双端队列,它既可以当...

  • ArrayDeque

    ArrayDeque Deque接口的大小可变数组的实现。 特性: 底层实现时循环数组 没有容量限制,在数组元素装...

网友评论

      本文标题:ArrayDeque

      本文链接:https://www.haomeiwen.com/subject/chpouxtx.html