ArrayList的擴容機制

2022-07-04 09:06:09 字數 3856 閱讀 6039

arraylist的擴容機制:

當向arraylist中新增元素的時候,arraylist的儲存容量如果滿足新元素的容量要求,則直接儲存;arraylist的儲存容量如果不滿足新元素的容量要求,arraylist會增強自身的儲存能力,以達到儲存新元素的要求。

因為不同的jdk版本的擴容機制可能有差異,下面以jdk1.8為例說明

一、構造方法

public arraylist(int

initialcapacity)

else

if (initialcapacity == 0)

else

}/*** constructs an empty list with an initial capacity of ten.

* arraylist():並不是在初始化arraylist的時候就設定初始容量為空,而是在新增第乙個元素時,將初始容量設定為10(default_capacity)。

* 在jdk1.6中,無參構造方法的初始容量為10

*/public

arraylist()

public arraylist(collection extends e>c)

else

}

二、主要方法

1. 引數說明

//

預設的初始容量

private

static

final

int default_capacity = 10;

/*** 當使用構造方法arraylist(int initialcapacity) 時,若initialcapacity=0,則將arraylist初始化為empty_elementdata

* 或使用arraylist(collection extends e> c) ,collection為空時

*/private

static

final object empty_elementdata ={};

/*** 當使用構造方法arraylist() 時,將arraylist初始化為空

*/private

static

final object defaultcapacity_empty_elementdata ={};

/*** elementdata是儲存arraylist元素的陣列。

* arraylist的容量也就是陣列elementdata的長度。

* 新增第乙個元素時,任何elementdata == defaultcapacity_empty_elementdata(即陣列為空,elementdata = {})的情況,arraylist的容量都將擴充套件為default_capacity。

*/transient object elementdata; //

non-private to simplify nested class access

//the size of the arraylist (the number of elements it contains).

private

int size;

2. add(e e)方法

public

boolean

add(e e)

每次在add()乙個元素時,arraylist都需要對這個list的容量進行乙個判斷。通過ensurecapacityinternal()方法確保當前arraylist維護的陣列具有儲存新元素的能力,經過處理之後將元素儲存在陣列elementdata的尾部

3. ensurecapacityinternal方法

private

void

ensurecapacityinternal(int

mincapacity)

ensureexplicitcapacity(mincapacity);

}

ensurecapacityinternal判斷arraylist預設的元素儲存資料是否為空,為空則設定最小要求的儲存能力為必要儲存的元素和預設儲存元素個數的兩個資料之間的最大值,然後呼叫ensureexplicitcapacity方法實現這種最低要求的儲存能力

4. ensureexplicitcapacity方法

private

void

ensureexplicitcapacity(int

mincapacity)

若arraylist已有的儲存能力滿足最低儲存要求,則返回add直接新增元素;如果最低要求的儲存能力》arraylist已有的儲存能力,這就表示arraylist的儲存能力不足,因此需要呼叫 grow();方法進行擴容

5. grow()方法

private

void

grow(int

mincapacity)

當arraylist擴容的時候,首先會設定新的儲存能力為原來的1.5倍,如果擴容之後仍小於必要儲存要求mincapacity,則取值為mincapacity。

若新的儲存能力大於max_array_size,則取值為integer.max_value

在grow方法中,確定arraylist擴容後的新儲存能力後,呼叫的arrays.copyof()方法進行對原陣列的複製,再通過呼叫system.arraycopy()方法(native修飾)進行複製,達到擴容的目的

6. hugecapacity方法

private

static

inthugecapacity(int

mincapacity)

從hugecapacity方法看出,arraylist最大的儲存能力:儲存元素的個數為整型的範圍。

例:當arraylist中的當前容量已經為integer.max_value,仍向arraylist中新增元素時,丟擲異常

arraylist擴容的例子:

arraylist相當於在沒指定initialcapacity時就是會使用延遲分配物件陣列空間,當第一次插入元素時才分配10(預設)個物件空間。

public

class

arraylisttest2

}

假如有20個資料需要新增,那麼會分別在第一次的時候,將arraylist的容量變為10 (如下圖一);之後擴容會按照1.5倍增長。也就是當新增第11個資料的時候,arraylist繼續擴容變為10*1.5=15(如下圖二);當新增第16個資料時,繼續擴容變為15 * 1.5 =22個。

總結在jdk1.8中,如果通過無參構造的話,初始陣列容量為0,當真正對陣列進行新增時(即新增第乙個元素時),才真正分配容量,預設分配容量為10;當容量不足時(容量為size,新增第size+1個元素時),先判斷按照1.5倍(位運算)的比例擴容能否滿足最低容量要求,若能,則以1.5倍擴容,否則以最低容量要求進行擴容。

執行add(e e)方法時,先判斷arraylist當前容量是否滿足size+1的容量;

在判斷是否滿足size+1的容量時,先判斷arraylist是否為空,若為空,則先初始化arraylist初始容量為10,再判斷初始容量是否滿足最低容量要求;若不為空,則直接判斷當前容量是否滿足最低容量要求;

若滿足最低容量要求,則直接新增;若不滿足,則先擴容,再新增。

arraylist的最大容量為integer.max_value

參考:

ArrayList擴容機制

1.成員變數 預設給定的初始容量 private static final int default capacity 10 無參構造器中所使用到的空陣列例項 private static final object empty elementdata 有參構造器中所使用到的空陣列例項 private ...

ArrayList擴容機制

arraylist實現了list介面。它是乙個可調整大小的陣列,可以用來存放各種形式的資料。並提供了包括crud在內的多種方法可以對資料進行操作,但是它不是執行緒安全的。list擴容實現步驟總的來說就是分兩步 陣列定義的時候,因為需要給它分配連續的記憶體空間,需要預先指定其大小。因此當存放的資料大於...

ArrayList的擴容機制

arraylist的底層資料結構是動態陣列 capacity相當於初始化陣列的大小 size就相當於陣列的實際長度 default initial capacity.private static final int default capacity 10 檢視原始碼可以發現,預設容量是10。但是當我...