ArrayList删除实现

sur*_*esh 0 java data-structures

我正在通过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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们正在回溯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
Run Code Online (Sandbox Code Playgroud)

可以请有人带我通过代码来更好地理解.

Tho*_*mas 6

该部分检查是否必须移动要删除的索引右侧的任何元素以关闭由删除创建的"洞".

示例:假设您有一个这样的列表:"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;然后将做两件事:它将大小减1,结果size = 4将它设置为索引4(即第5个元素)的值为null,导致数组看起来像这样:["A","B","D","E",null,null,null,null]