Java集合Queue-ArrayDeque

ArrayDeque 的結構是一個循環數組,用做棧比Stack 性能優秀,用做隊列比LinkedList 要好算法

1 成員變量及構造函數

  1. 成員變量數組

    由於是循環數組,因此自己就是一個數組elements來存儲元素,而且有數組的容量;而循環意味着在插入刪除元素的時候一定有兩個方向,因此會有headtail,相似於雙指針。函數

  2. 構造函數性能

    分析allocateElements ,原理上和HashMap中的計算容量的算法是差很少的spa

    以上函數是爲了找到大於等於須要長度的最小2的冪整數。指針

2 增長

  1. offercode

  2. add隊列

  3. pushci

能夠看到全部關於新增的操做都是調用了add 相關函數,源碼的解釋也如上圖所示。element

3 刪除

  1. remove

  2. pop

  3. poll

4 查看

  1. contains

  2. peek

5 擴容

擴容發生的時機在增長中有體現,當head == tail 的時候就會調用doubleCapacity 進行擴容

爲何不直接用一次System.arraycopy 來完成數組的遷移呢

若是直接一次性所有遷移就會面臨一個問題,head和tail分別指向哪裏呢。

  • 對於head,增長元素下標自減,刪除元素自增;對於tail,增長元素下標自增,刪除元素自減。
  • 通常狀況下,head指向的是頭元素,tail指向的是尾元素

基於上述兩方面的考慮,最終的遷移如圖所示。

  • 往頭部增長元素: 那麼和一開始的分析同樣,在element.length - 1 下標往小下標增長。
  • 刪除頭部元素: 那麼就是4 = 0,而且head指向5,這裏的數字是指元素而不是下標
  • 往尾部增長元素: tail正常往右移動
  • 刪除尾部元素: 3 = 0,而且tail指向3

創做不易,歡迎點贊,收藏和分享啦!下面是我的公衆號,有興趣的能夠關注一下,基本2,3天1更技術文章!!!