public boolean add(E paramE)
{
ensureCapacity(this.size + 1);
this.elementData[(this.size++)] = paramE;
return true;
}
|
首先可以看到add這個方法的參數是以E開頭,表示該參數可以是任何的類別。
ensureCapacity方法用來確認容量是否足以加入新的節點。
public void ensureCapacity(int paramInt)
{
this.modCount += 1;
int i = this.elementData.length;
if (paramInt <= i)
return;
Object[] arrayOfObject = this.elementData;
int j = i * 3 / 2 + 1;
if (j < paramInt)
j = paramInt;
this.elementData = Arrays.copyOf(this.elementData, j);
}
|
這段比較有趣的地方是,j = i * 3 / 2 + 1這段,可以看出配置空間的動作並不是每次配置一次(+1)的方式,而是以這個公式去新增,一次可能配出許多個空間預留給下次的加入。
比如說現在List中有10個元素,當我們要加入第十一個元素時,11會被傳入ensureCapacity方法,可以看到if (paramInt <= i),明顯是大於的因此繼續執行,執行到j這行時,j = 11 * 3 / 2 + 1 = 16;因此系統在此時會把原本size為10的陣列變成size為16陣列,在ensureCapacity結束後,新的元素順利加入。
圖解 :
假設目前陣列長度 = 10
|
|
|
|
|
|
|
|
|
|
add(‘test’); // 第11個元素
加入第11元素因為空間不夠,所組需要從新配置空間,陣列長度 = 16
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
add(‘test’); // 第12個元素
空間足夠,無須從新配置,直接加入。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
沒有留言:
張貼留言