簡體   English   中英

ArrayList移除實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM