[英]Java: ArrayList add() and remove() performance, implementation?
[英]ArrayList remove implementation
我正在通過ArrayList刪除sourceCode。
public E remove(int index) {
rangeCheck(index);
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
在上面的代碼中,我們正在重用oldValue,但無法理解下面的代碼的id用途
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
elementData[--size] = null; // Let gc do its work
可以請別人指導我逐步理解代碼。
該部分檢查是否必須移動要刪除的索引右側的任何元素,以關閉由刪除創建的“孔”。
示例:假設您有一個這樣的列表: "A","B","C","D","E"
。 在內部,它將是一個Object[]
數組,其長度大於5(通常為2的冪,但它可以具有不同的值),假設大小為8。因此它看起來像["A","B","C","D","E",null,null,null]
。
現在,您刪除"C"
,即索引2:
int numMoved = size - index - 1;
將導致numMoved = 5 - 2 - 1 = 2
,即,必須向右移動2個元素(“ D”和“ E”),並且滿足if條件。 System.arraycopy(elementData, index + 1, elementData, index, numMoved);
“移動”(復制)數組右邊的部分,即["A","B","C","D","E",null,null,null]
將轉換為["A","B","D","E","E",null,null,null]
。 elementData[--size] = null;
然后將執行2件事:將大小減1導致size = 4
,並將索引4(即第5個元素)的值設置為null,從而導致數組如下所示: ["A","B","D","E",null,null,null,null]
ArrayList由數組支持。
當您從列表中移動一個項目時,所有項目都需要向左移動,因此最終不會留有空白。
上面的代碼實際上並沒有從數組中刪除索引的項目,它只是將所有元素移到左邊,然后將數組中的最后一個元素設置為null。
[1,2,3,4,5,6]
^Remove 3
[1,2,4,5,6,6]
Shift left
[1,2,4,5,6,null]
Set the last element to null
1)如果您從列表的末尾刪除,則不必移動元素,但是如果您從列表之間的中間刪除,則必須將當前已刪除元素的右邊的元素向左移動。
2)elementData [-size] = null;
使用它是為了可以對其進行垃圾回收,因為您已經從列表中刪除了1個元素,因此沒有活潑的引用。 因此最好由垃圾收集器處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.