ArrayList的擴容時機和擴容方式

2021-10-09 19:20:36 字數 1807 閱讀 1444

這裡我簡單介紹擴容機制的主要實現部分,對於一些理解能力很好的朋友,可以直接看這部分,後面的可以忽略:

擴容時機,arraylist的擴容時機,主要看它底層的方法;

private

void

ensureexplicitcapacity

(int mincapacity)

主要判斷所需的長度大小是否小於陣列的長度,如果陣列的長度比所需要的小,那麼久進行擴容;

擴容方式, 在判斷需要擴容的情況下,對陣列進行擴容,下面來介紹擴容的主要**;

private

void

grow

(int mincapacity)

這就是擴容方式的主要**,但是,我個人覺得,實際上並不是按照1.5倍擴容,而是按照 位運算算出來的, oldcapacity + (oldcapacity >> 1),或者可以說是 1.5倍後向下取整;例如:原來的長度為15,1111 + 0111 = 22;擴容後的陣列長度應該為22。

這部分是對上一部分做乙個詳細的介紹,如何在上面的部分,你已經看懂了,那麼這部分你可不用在花時間看了。

擴容時機

擴容時機的話,我們主要從add方法入手,最後判斷是否擴容是在ensureexplicitcapacity()方法,下面乙個個看:

/**

* 新增元素到集合的末尾

*/public

boolean

add(e e)

// 這裡的 mincapacity = size + 1

// 可以理解為,如果要新增這個元素,集合需要的大小

private

void

ensurecapacityinternal

(int mincapacity)

// 主要判斷 集合需要的最小的大小,如何是初始化,則為10,反之則為 size + 1

private

static

intcalculatecapacity

(object[

] elementdata,

int mincapacity)

return mincapacity;

}// 這裡 判斷是否需要擴容

private

void

ensureexplicitcapacity

(int mincapacity)

大家可以在ensureexplicitcapacity方法中看到,是否需要擴容的判斷if (mincapacity - elementdata.length > 0)

總結:當新增元素後的集合大小(這個大小是理論上的,實際上還沒有新增元素),比底層實現集合的陣列的長度大的話,就進行擴容;

2.擴容方式

擴容方式,主要分析grow這個方法

private

void

grow

(int mincapacity)

以上就是我對arraylist原始碼檢視,然後得出的一些結論,希望對大家有幫助,如果有錯誤,希望大家指出,我及時修改,以免誤導大家。最後,大家在學習的時候,也可以通過debug的方式,一遍遍跑原始碼,這樣也會讓自己對知識點理解更加深刻,不會說看完就忘。

ArrayList的擴容方式和擴容時機

arraylist的底層是乙個動態陣列,arraylist首先會對傳進來的初始化引數initalcapacity進行判斷,如果引數等於0,則將陣列初始化為乙個空陣列,如果不等於0,將陣列初始化為乙個容量為10的陣列。初始容量也可以自定義指定。隨著不斷新增元素,陣列大小增加,當陣列的大小大於初始容量的...

ArrayList的擴容方式和擴容時機

初始化 arraylist的底層是乙個動態陣列,arraylist首先會對傳進來的初始化引數initalcapacity進行判斷 擴容時機 當陣列的大小大於初始容量的時候 比如初始為10,當新增第11個元素的時候 就會進行擴容,新的容量為舊的容量的1.5倍。擴容方式 擴容的時候,會以新的容量建乙個原...

ArrayList擴容和拷貝

arraylist 本質是乙個動態擴容的陣列,擴容時候是原來的1.5倍。核心 int newcapacity oldcapacity oldcapacity 1 向右邊移一位則是除於2 arraylist 如何新增或者刪除某個元素。新增乙個元素 判斷陣列容量不夠時候,就動態擴容為原來陣列容量的1.5...