ArrayList add方法的實現之擴容


初探ArrayList的1.5倍擴容

add方法是通過在list的尾部追加元素的方法,添加數據的。

其中,調用了一個叫ensureCapacityInternal方法,實現list的容量換算等:

注意:參數傳的是當前需要的最小的容量,方法首先確認當前ArrayList實例是否為空,如果為空則比較所需容量和默認容量,取其大者作為所需最小容量值。然后執行ensureExplicitCapacity進一步確定容量,以及是否需要擴容。當所需最小容量大於當前elementData數組長度時,要進行擴容操作。

以上只是真實容量和所需容量的比較,其目的是計算出list的最終容量。真正實現擴容的方法是grow方法:

通過上述:我們大概可知當add一個元素時候的擴容流程。

添加一個元素,首先計算當前的list所需最小的容量大小,是否需要擴容等。當需要擴容時:

1.得到當前的ArrayList的容量(oldCapacity)。

2.計算除擴容后的新容量(newCapacity),其值(oldCapacity + (oldCapacity >> 1))約是oldCapacity 的1.5倍。

這里采用的是移位運算(關於移位運算,后續會講到)。為什么采用這種方法呢?應該是出於效率的考慮。

3.當newCapacity小於所需最小容量,那么將所需最小容量賦值給newCapacity。

4.newCapacity大於ArrayList的所允許的最大容量,處理。

5.進行數據的復制,完成向ArrayList實例添加元素操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM