1. 概述
2. 用法
ArrayDeque
有如下构造方法:
public ArrayDeque() {
elements = new Object[16];
}
public ArrayDeque(int numElements) {
allocateElements(numElements);
}
public ArrayDeque(Collection<? extends E> c) {
allocateElements(c.size());
addAll(c);
}
numElements
表示元素个数,初始分配会至少容纳这么多元素,但空间不是正好 numElements
这么大。
3. 基本原理
ArrayDeque
有如下实例变量:
private transient E[] elements;
private transient int head;
private transient int tail;
elements
就是存储元素的数组。ArrayDeque
的高效来源于 head
和 tail
这两个成员变量,他们使得物理上简单的从头到尾的数组变成了一个逻辑上循环的数组,避免了在头尾操作时的移动。
3.1 循环数组
对于一般数组而言,比如 arr
,第一个元素为 arr[0]
,最后一个为 arr[arr.length - 1]
。但对于 ArrayDeque
中的数组,它是一个逻辑上的循环数组,所谓循环是指元素到数组尾之后可以接着从数组头开始,数组的长度,第一个和最后一个元素都与这个 head
和 tail
这两个变量有关,具体来说:
- 如果
head
与tail
相同,则数组为空,长度为0
- 如果
tail
大于head
,则第一个元素为elements[head]
,最后一个元素为elements[tail - 1]
,长度为tail - head
,元素索引从head
到tail - 1
- 如果
tail
小于head
,且为0
,则第一个元素为elements[head]
,最后一个元素为elements[elements.length - 1]
,元素索引从head
到elements[elements.length -1]
- 如果
tail
小于head
,且大于0
,会形成循环,第一个元素为elements[head]
,最后一个元素是elements[tail - 1]
,元素索引从head
到elements.length - 1
,然后再从0
到tail - 1