一、什么是ArrayDeque
1、Deque与Queue
了解这个之前,我们要先知道什么是Deque,它和Queue有什么区别:在java中,Queue被定义成单端队列使用,Deque被定义成双端队列 即Queue可以访问两端但是只能修改队头,而Deque可以访问两端并且可以在队首和队尾删除和插入元素。
基于Deque的特性,ArrayDeque即可以作为Queue来使用也可以作为栈来使用,而且可以决定队列那边受限或者栈哪边进出。
2、ArrayDeque的构造器
public ArrayDeque() {
elements = new Object[16];
}
public ArrayDeque(int numElements) {
allocateElements(numElements);//调用allocateElements方法
}
private void allocateElements(int numElements) {
//初始化elements元数据数组,长度由calculateSize方法决定
elements = new Object[calculateSize(numElements)];
}
// 找到大于需要长度的最小的2的幂整数,至少要大于8
private void allocateElements(int numElements) {
// MIN_INITIAL_CAPACITY为8
int initialCapacity = MIN_INITIAL_CAPACITY;
// 假设用户输入的为9
if (numElements >= initialCapacity) {
// initialCapacity = 9;
initialCapacity = numElements;
// initialCapacity = 9 | ( 9 >>> 1)
// initialCapacity = ( 1001 ) | ( 0100 ) = 1101 = 13;
initialCapacity |= (initialCapacity