給jdk寫注釋系列之jdk1.6容器(11):Queue之ArrayDeque源碼解析
來自: 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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!