• 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性能更好,使用时最好指定初始化容量,重复
  • 相关阅读:
    python Exception中的raise、assert
    python循环语句与其他编程语言不同之处
    【转】最大似然估计
    尝试发表代码
    奇异分解(SVD)
    Python学习笔记3-string
    梯度下降法
    前后端分离
    Trie树
    HashMap的工作原理以及代码实现,为什么要转换成红黑树?
  • 原文地址:https://www.cnblogs.com/luckyCoder/p/12733050.html
Copyright © 2020-2023  润新知