初探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實例添加元素操作。
