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