一、ArrayDeque定义
ArrayDeque在java.util.ArrayDeque中定义。
其实现上通过数组保存队列。如下:
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
{
......
transient Object[] elements;
transient int head;
transient int tail;
private static final int MIN_INITIAL_CAPACITY = 8;
......
}
注意:
-
ArrayDqueue使用数组存储实现的是一个 循环队列。所以head、tail不并不一定是数组的头和尾。
-
head为队列头元素的索引。
-
tail并不是队列尾部元素的索引,而是尾部元素的下一位。即:下一个将要被加入的元素的索引。
-
ArrayDeque空间满,默认扩容 的比例是2倍。
二、主要方法
1. 构造类方法
(1)不带参数,创建ArrayDeque默认为16个单元。
public ArrayDeque() {
elements = new Object[16];
}
(2)指定初始长度,创建队列
public ArrayDeque(int numElements) {
allocateElements(numElements);
}
(3)指定集合,创建队列,把集合内容放入队列
public ArrayDeque(Collection<? extends E> c) {
allocateElements(c.size());
addAll(c);
}
2. 向队列添加元素
(1)在队列头插入元素
注意:如果当前队列头刚好在数组的[0]位置,新插入后,实际上是插入到elements[]的末尾单元,因为是循环队列。
public void addFirst(E e)
public boolean offerFirst(E e)
(2)在队列尾插入元素
public void addLast(E e)
public boolean offerLast
3. 从队列中取元素
(1)取队列头元素后,删除队列中此元素
public E removeFirst() //队列为空,抛出异常
public E pollFirst() //队列为空,返回Null
(2)取队列尾元素,删除队列中此元素
public E removeLast() //队列为空,抛出异常
public E pollLast() //队列为空,返回Null
(3)查询队列头元素后,不删除队列中此元素
public E getFirst() //队列为空,抛出异常
public E peekFirst() //队列为空,返回Null
(4)查询队列尾元素,不删除队列中此元素
public E getLast() //队列为空,抛出异常
public E peekLast() //队列为空,返回Null
三、作为FIFO的方法
实现的Queue接口方法。默认当作先进先出(FIFIO)队列管理。进在队列尾,出在队列头。
public boolean add(E e) //同addLast()
public boolean offer(E e) //同offerLast()
public E remove() //同removeFirst()
public E poll() //同pollFirst()
public E element() //同getFirst()
public E peek() //同peekFirst()
四、作为LIFO
实现了ArrayDeque作为后进先出(LIFO)(栈)使用的方法。
public void push(E e) //等同于addFirst()
public E pop() //等同于removeFirst()