ArrayDeque
的結構是一個循環數組,用做棧比Stack
性能優秀,用做隊列比LinkedList
要好算法
成員變量數組
由於是循環數組,因此自己就是一個數組elements
來存儲元素,而且有數組的容量;而循環意味着在插入刪除元素的時候一定有兩個方向,因此會有head
和tail
,相似於雙指針。函數
構造函數性能
分析allocateElements
,原理上和HashMap
中的計算容量的算法是差很少的spa
以上函數是爲了找到大於等於須要長度的最小2的冪整數。指針
offer
code
add
隊列
push
ci
能夠看到全部關於新增的操做都是調用了add
相關函數,源碼的解釋也如上圖所示。element
remove
pop
poll
contains
peek
擴容發生的時機在增長中有體現,當head == tail
的時候就會調用doubleCapacity
進行擴容
爲何不直接用一次System.arraycopy
來完成數組的遷移呢
若是直接一次性所有遷移就會面臨一個問題,head和tail分別指向哪裏呢。
基於上述兩方面的考慮,最終的遷移如圖所示。
element.length - 1
下標往小下標增長。創做不易,歡迎點贊,收藏和分享啦!下面是我的公衆號,有興趣的能夠關注一下,基本2,3天1更技術文章!!!