ArrayList擴容機制

2021-10-03 10:26:35 字數 2698 閱讀 2715

1.成員變數

// 預設給定的初始容量

private static final int default_capacity = 10;

// 無參構造器中所使用到的空陣列例項

private static final object empty_elementdata = {};

// 有參構造器中所使用到的空陣列例項

private static final object defaultcapacity_empty_elementdata = {};

// 資料元素集合

transient object elementdata;

//當前陣列的長度

private int size;

2.構造方法

/**

* 構造乙個初始容量為10的空列表

*/public arraylist()

/*** 構造乙個具有指定容量大小的空列表

*/public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}/**

* 構造乙個包含指定集合的元素的列表

*/public arraylist(collection<? extends e> c) else

}

3.插入

/**

* 在集合末尾新增元素

*/public boolean add(e e)

/*** 在集合中的指定位置新增元素

*/public void add(int index, e element)

/*** 將指定集合按順序新增至原集合的末尾

*/public boolean addall(collection<? extends e> c)

/*** 將指定集合按順序,從指定位置新增至原集合

*/public boolean addall(int index, collection<? extends e> c)

4.擴容機制

arraylist擴容的核心:ensurecapacityinternal方法

defaultcapacity_empty_elementdata:是用來使用預設構造方法時候返回的空陣列。如果第一次新增資料的話那麼陣列擴容長度為default_capacity=10。

empty_elementdata:出現在需要用到空陣列的地方,其中一處就是使用自定義初始容量構造方法時候如果你指定初始容量為0的時候就會返回。

private void ensurecapacityinternal(int mincapacity) 

private static int calculatecapacity(object elementdata, int mincapacity)

return mincapacity;

} private void ensureexplicitcapacity(int mincapacity)

private void grow(int mincapacity)

private static int hugecapacity(int mincapacity)

1>當前陣列是由預設構造方法生成的空陣列並且第一次新增資料。

此時從方法 calculatecapacity中可以看出,mincapacity== 10,當陣列長度大於10的時候才會進入到grow方法中進行擴容(按照當前容量的1.5倍進行擴容);

2>當前陣列是由自定義初始容量構造方法建立並且指定初始容量為0。

此時mincapacity == 1,elementdata.length == 0,

方法grow中,mincapacity ==1   oldcapacity == 0    newcapacity < 0  =》newcapacity = 1

mincapacity == 2  oldcapacity == 1    newcapacity == 1.5  =》newcapacity = 2

mincapacity == 3  oldcapacity == 2    newcapacity == 3  =》newcapacity = 3

mincapacity == 4  oldcapacity == 3    newcapacity == 4.5  =》newcapacity = 4.5

mincapacity == 5  oldcapacity == 4    newcapacity == 6  =》newcapacity = 6

那麼根據下面邏輯可以看到最後陣列的容量會從0變成1。根據上述演算法前四次擴容每次都 +1,在第5次新增資料進行擴容的時候才是按照當前容量的1.5倍進行擴容。

3>當擴容量(newcapacity)大於arraylist陣列定義的最大值後會呼叫hugecapacity來進行判斷。如果mincapacity已經大於integer的最大值(溢位為負數)那麼丟擲outofmemoryerror(記憶體溢位)否則的話根據與max_array_size的比較情況確定是返回integer最大值還是max_array_size。這邊也可以看到arraylist允許的最大容量就是integer的最大值(-2的31次方~2的31次方減1)。

ArrayList擴容機制

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

ArrayList動態擴容機制

初始化 有三種方式預設的構造器,將會以預設的大小來初始化內部的陣列 public arraylist 用乙個icollection物件來構造,並將該集合的元素新增到arraylist public arraylist collection c 用指定的大小來初始化內部的陣列 public array...

ArrayList自動擴容機制

arraylist 操作的底層其實是object 陣列,對該陣列進行了包裝。arraylist 在建立時若不指定元素個數,會使用預設值 private static final int default capacity 10 內部相當於建立了乙個 object object new object 1...