給jdk寫注釋系列之jdk1.6容器(11):Queue之ArrayDeque源碼解析

gy737859 8年前發布 | 12K 次閱讀 JDK Java開發

來自: http://www.importnew.com/17670.html

public interface Queue<E> extends Collection<E> {
    // 增加一個元素到隊尾,如果隊列已滿,則拋出一個IIIegaISlabEepeplian異常
    boolean add(E e);
    // 添加一個元素到隊尾并返回true,如果隊列已滿,則返回false
    boolean offer(E e);
    // 移除并返回隊列頭部的元素,如果隊列為空,則拋出一個NoSuchElementException異常
    E remove();
    // 移除并返問隊列頭部的元素,如果隊列為空,則返回null
    E poll();
    // 返回隊列頭部的元素,如果隊列為空,則拋出一個NoSuchElementException異常
    E element();
    // 返問隊列頭部的元素,如果隊列為空,則返回null
    E peek();
}

看到Queue的定義,有沒有發現它和Stack的方法是非常相似的。

但是ArrayDeque并不是一個固定大小的隊列,每次隊列滿了就會進行擴容,除非擴容至超過int的邊界,才會拋出異常。所以這里的add和offer幾乎是沒有區別的。

2.底層存儲

 

當然從ArrayDeque的命名就可以看出他的底層是用數組實現的(而LinkedList則是用鏈表實現的隊列),來主要看一下ArrayDeque。

// 底層用數組存儲元素
    private transient E[] elements;
     // 隊列的頭部元素索引(即將pop出的一個)
      private transient int head;
     // 隊列下一個要添加的元素索引
      private transient int tail;
     // 最小的初始化容量大小,需要為2的n次冪
      private static final int MIN_INITIAL_CAPACITY = 8;

這里需要注意的是MIN_INITIAL_CAPACITY,這個初始化容量必須為2的n次冪。為什么必須要是2的n次冪呢,還記得HashMap中我們的分析嗎,HashMap也要求其底層數組的初始容量必須為2的n次冪,還記得當時是基于什么原因嗎?不記得話,那就返回去看一下《 給jdk寫注釋系列之jdk1.6容器(4)-HashMap源碼解析 》。那么ArrayDeque這里又是基于什么考慮呢,我們下面再看。

而tail不是最后一個元素的索引,是下一個要添加的元素索引,也就是最后一個元素+1。

3.構造方法

</div> </div>

 本文由用戶 gy737859 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!