目录
allocateElements(int numElements)
ArrayDeque实现了Deque接口,而Deque继承了Queue接口。Queue一般来说是先进先出(FIFO)的,但是这个也不一定的。先看看Queue声明了哪些方法。
//往队列中添加元素,当队列满时,抛出异常
boolean add(E e);
//往队列中添加元素,当队列满时,返回false
boolean offer(E e);
//从队列中获取并删除第一个元素,当队列空时,抛出异常
E remove();
//从队列中获取并删除第一个元素,当队列空时,返回null
E poll();
//从队列中获取(不删除)第一个元素,当队列空时,抛出异常
E element();
//从队列中获取(不删除)第一个元素,当队列空时,返回null
E peek();
而Deque增加了一些新的方法:
//往队列中的头部添加元素,当队列满时,抛出异常
void addFirst(E e);
//往队列中的尾部添加元素,当队列满时,抛出异常
void addLast(E e);
//往队列中的头部添加元素,当队列满时,返回false
boolean offerFirst(E e);
//往队列中的尾部添加元素,当队列满时,返回false
boolean offerLast(E e);
//从队列中获取并删除第一个元素,当队列空时,抛出异常
E removeFirst();
//从队列中获取并删除最后一个元素,当队列空时,抛出异常
E removeLast();
//从队列中获取并删除第一个元素,当队列空时,返回false
E pollFirst();
//从队列中获取并删除最后一个元素,当队列空时,返回false
E pollLast();
//从队列中获取(不删除)第一个元素,当队列空时,抛出异常
E getFirst();
//从队列中获取(不删除)最后一个元素,当队列空时,抛出异常
E getLast();
//从队列中获取(不删除)第一个元素,当队列空时,返回null
E peekFirst();
//从队列中获取(不删除)最后一个元素,当队列空时,返回null
E peekLast();
//删除队列中第一个指定的元素
boolean removeFirstOccurrence(Object o);
//删除队列中第一个指定的元素
boolean removeLastOccurrence(Object o);
//入栈
void push(E e);
//出栈
E pop();
ArrayDeque是deque接口的可调整大小的数组实现。ArrayDeque没有容量限制;它们根据需要增长以支持使用。它们不是线程安全的;在没有外部同步的情况下,它们不支持多个线程并发访问。禁止使用空元素。当用作堆栈时,此类可能比stack快,当用作队列时,此类可能比Linkedlist快。
类的属性:
//用来存储双端队列中元素的数组
transient Object[] elements;
//双端队列中首端第一个元素在数组中的位置
transient int head;
//双端队列中尾端第一个可以插入元素的空位
transient int tail;
//双端队列的最小容量,必须是2的指数倍
private static final int MIN_INITIAL_CAPACITY = 8;
allocateElements(int numElements)
首先判断指定大小numElements与MIN_INITIAL_CAPACITY
的大小关系。如果小于MIN_INITIAL_CAPACITY
,则直接分配大小为MIN_INITIAL_CAPACITY
的数组;如果大于MIN_INITIAL_CAPACITY
,则进行无符号右移操作,然后在加1,这样就可以寻找到大于numElements的最小2的幂次方。
原理:无符号右移再进行按位或操作,就是将其低位全部补成1,然后再自加加一次,就是再向前进一位。这样就能得到其最小的2次幂。之所以需要最多移16位,是为了能够处理大于2^16次方数。
最后再判断值是否小于0,因为如果初始值在int最大值2^31-1和2^30之间,进行一系列移位操作后将得到int最大值,再加1,则溢出变成负数,所以需要检测临界值,然后再右移1位!!!
作用:分配空数组以保存给定数量的元素。
doubleCapacity()
如图所示:
作用:将双端队列的容量扩大两倍。