ArrayDeque——01初探

简述

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处)
  • 队列的方法(部分)

    • 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(),即弹出堆栈顶部的元素
  • 堆栈的方法(部分)

    • push(),栈顶添加元素,调用的addFirst(),inserts the element at the front of this deque
    • pop(),弹出元素(相当与队列中的removeFirst()),返回队列头部的元素,并将当前头部值设为null,然后head++
    • peek(),返回队列头部的元素
    • offer(),本质调用addLast方法
  • 总结

    • ArrayDeque是堆栈队列线性结构 实现,适合在非并发条件下使用,可以作为栈也可以作为队列,比Stack或LinkedList性能更好,使用时最好指定初始化容量,重复
原文地址:https://www.cnblogs.com/luckyCoder/p/12733050.html