简述
Resizable-array implementation of the Deque interface. Array deques have no capacity restrictions; they grow as necessary to support usage. They are not thread-safe; in the absence of external synchronization, they do not support concurrent access by multiple threads. Null elements are prohibited. This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable{
transient Object[] elements; // non-private to simplify nested class access
transient int head;
transient int tail;
}
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
transient int size = 0;
transient Node<E> first = 0;
transient Node<E> last = 0;
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
特点
- 并发不安全,作为
堆栈
结构(线性栈)时比Stack
类性能更好,作为队列
结构(链式队列)使用时比LinkedList
性能更好
与LinkedList 异同
- 相同点
- 两者都既可以当作堆栈结构,也可以作为队列数据结构
- 不同点
- ArrayDeque 是底层数据结构是线性表(Object[]),不允许有存放NULL值
- LinkedList 底层数据结构是双向链表(Node(Node prev,Node item,Node next)),数据域可以为NULL
ArrayDeque
-
ArrayDeque扩容
- head==tail 时进行扩容,调用
doubleCapacity()
(内部调用arraycopy()
)方法 - copy 到新数组的元素是经过调整的,将所有元素统一从新数组索引0处放置(因为进行栈或队列的删除元素操作时,head会向右移动偏离索引0处,故移到新数组进行了调整,head重放置0处)
- head==tail 时进行扩容,调用
-
队列的方法(部分)
- addlast(),队列尾部(tail)添加元素,
tail = (tail + 1) & (elements.length - 1))
tail+1,tail右移 - add(),实际上还是会调用addLast()方法
- addFirst(),队列首部(head)添加元素,
elements[(head-1)&(elements.lenrth-1)]
=e,head--,头部左移 - removeFirst(),本质调用的是pollFirst(),移除 head 处的值,head++
- remove(),本质调用的是pollFirst(),即弹出堆栈顶部的元素
- addlast(),队列尾部(tail)添加元素,
-
堆栈的方法(部分)
- push(),栈顶添加元素,调用的addFirst(),
inserts the element at the front of this deque
- pop(),弹出元素(相当与队列中的removeFirst()),返回队列头部的元素,并将当前头部值设为null,然后head++
- peek(),返回队列头部的元素
- offer(),本质调用addLast方法
- push(),栈顶添加元素,调用的addFirst(),
-
总结
- ArrayDeque是
堆栈
和队列
的线性结构
实现,适合在非并发条件下使用,可以作为栈也可以作为队列,比Stack或LinkedList性能更好,使用时最好指定初始化容量,重复
- ArrayDeque是