3

这是一个非常直截了当的问题......只是在网上找不到直截了当的答案。

考虑我有一个List<String> listOfStrings = new ArrayList();,它填充了 20 个值。

如果listOfStings.get(0) = zero, listOfStrings.get(1) = one, 等等...

我愿意listOfStrings.remove(0)

listOfStrings.get(0)变成null,或者元素会向下移动 listOfStrings.get(0)one

4

2 回答 2

11

的实现ArrayList#remove(E)如下

public E remove(int index) {
    rangeCheck(index);

    modCount++;
    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;
}

elementData支持元素数组在哪里。

换句话说,它不是一个转变,因为它是元素的副本,减去缺失的元素。

给予elementData10 个元素

[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10]
                  ^ index 4

删除索引 4 处的元素会做

// copy elements starting from index+1
[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10]
                      ^ index+1

// to the same array starting at index
[ 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10]
                  ^ index     

// resulting in
[ 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | null ]

get(4)然后将返回值 (6)`。

apiList状态

移除此列表中指定位置的元素(可选操作)。将任何后续元素向左移动(从它们的索引中减去 1)。返回从列表中删除的元素。

如何实施取决于实施者。以上只是ArrayList的实现。

于 2013-09-08T20:33:28.093 回答
2

正如List interface documentation中指定的那样,它将向左移动。

于 2013-09-08T20:29:39.217 回答