Java ArrayList删除实现

Java ArrayList删除实现,java,data-structures,Java,Data Structures,我正在浏览ArrayList删除源代码 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)

我正在浏览ArrayList删除源代码

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”
。在内部,它将是一个长度大于5的
Object[]
数组(通常是2的一些幂,但可以是不同的值),比如说大小为8。因此,它看起来像
[“A”、“B”、“C”、“D”、“E”、null、null、null、null]

现在删除
“C”
,即索引2:

  • int numMoved=size-index-1将导致
    numMoved=5-2-1=2
    ,即必须移动右侧的2个元素(“D”和“e”),并且满足if条件
  • System.arraycopy(elementData,索引+1,elementData,索引,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]

该部件检查被移除索引右侧的任何元素是否必须移动,以关闭移除产生的“孔”

示例:假设您有这样一个列表:
“a”、“B”、“C”、“D”、“E”
。在内部,它将是一个长度大于5的
Object[]
数组(通常是2的一些幂,但可以是不同的值),比如说大小为8。因此,它看起来像
[“A”、“B”、“C”、“D”、“E”、null、null、null、null]

现在删除
“C”
,即索引2:

  • int numMoved=size-index-1将导致
    numMoved=5-2-1=2
    ,即必须移动右侧的2个元素(“D”和“e”),并且满足if条件
  • System.arraycopy(elementData,索引+1,elementData,索引,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]

阵列列表由阵列支持。
当您从列表中移动一个项目时,它后面的所有项目都需要向左移动,以免出现空白。
上面的代码实际上并没有从数组中删除索引项,它只是将它后面的所有元素移到左边,然后将数组中的最后一个元素设置为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

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个元素,所以没有对它的活动引用。因此,最好由垃圾收集器处理。

1)如果从列表末尾移除,则不必移动元素,但如果从列表中间移除,则必须移动元素 将当前删除的元素右侧的元素向左移动

2) elementData[--size]=null


使用它是为了垃圾收集它,因为您已经从列表中删除了1个元素,所以没有对它的活动引用。所以最好由垃圾收集器处理。

但是没有,我发现它在移位后再次初始化为oldValue,你能帮我填补我理解上的空白吗。@suresh
oldValue
是被删除的,因此不打算重新插入。感谢你填补我理解上的空白
ArrayList
不使用
String[]
存储数据<代码>对象[]
用于每种数据类型。在其他范围内,用户需要传递数组的元素类型以允许创建,因为在运行时不可能从类型参数中获取
Class
。@fabian你说得对,我使用的是
String[]
使其更容易理解,但我将对其进行更新以减少混淆。但没有,我发现它在移位后再次初始化为oldValue,你能帮我填补我理解上的空白吗。@suresh
oldValue
是被删除的,因此不打算重新插入。感谢你填补我理解上的空白
ArrayList
不使用
String[]
存储数据<代码>对象[]
用于每种数据类型。在其他范围内,用户需要传递数组的元素类型以允许创建,因为在运行时不可能从类型参数中获取
Class
。@fabian你说得对,我使用
String[]
使它更容易理解,但我会更新它以减少混淆。覆盖是正确的方法