Java集合之ArrayList擴容

JDK1.8

一,ArrayList的構造函數有三種

1.public ArrayList(int initialCapacity) {...},

 

如果傳入的參數initialCapacity合法的話,ArrayList會在elementData屬性中存入一個Object數組,長度爲傳參initialCapacity,這個elementData是什麼呢:

 

翻譯爲:

存儲ArrayList元素的數組緩衝區。ArrayList的容量是這個數組緩衝區的長度。任何空的ArrayList的elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA

當添加第一個元素時,長度將擴展爲DEFAULT_CAPACITY

ArrayList底層實現是數組,所以elementData就是用來存放你的數組數據的,大家都知道ArrayList是個泛型類,數據元素類型檢查已經在編譯期完成,所以新建的elementData是一個Object數組,這個數組緩存區可以存放任意類型的元素。

2.public ArrayList() {...}

 

其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA:

 

翻譯爲:

用於默認大小的空實例的共享空數組實例。我們將其與EMPTY_ELEMENTDATA區分開來,以便知道何時膨脹多少添加第一個元素。

結合上文的elementData,就知道當新建空的ArrayList時,數組緩衝區elementData存放的是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,也就是{},當添加第一個元素add()時,長度將會擴展爲DEFAULT_CAPACITY,也就是ArrayList的初始容量10,即Object[10]。

3.public ArrayList(Collection<? extends E> c) {...}

 

這種情況是傳參爲集合的情況,ArrayList會將傳參的集合轉爲數組toArray,並賦給elementData,其中toArray返回的就是一個Object數組

 

二,ArrayList的擴容

看對ArrayList增加元素的時候,用的方法:add

在ensureExplicitCapacity中,當minCapacity大於elementData的長度的時候(比如初始長度10),就需要擴容。看代碼minCapacity爲calculateCapacity(elementData, minCapacity)返回的值,看代碼calculateCapacity方法返回的是傳入的值size+1,或者當elementData爲新建的{},將對其進行第一次擴容,即10。

擴容的方法:grow()

可以看到,一次擴容爲oldCapacity + (oldCapacity >> 1),然後elementData = Arrays.copyOf(elementData, newCapacity);,會新建一個數組,然後將原來的elementData拷貝進去。

最後elementData[size++] = e;將新添加的元素放入數組緩衝區elementData

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章