34

假设我有一个ArrayList<String> data;

我正在使用data.add()函数将一些数据添加到这个数组中。假设我在这个数组中添加了 10 个字符串。数组的大小现在是 10。

如何销毁数组中的所有元素?该data.clear()函数刚刚将所有 10 个元素设置为 null。所以当我尝试添加另一个元素时,它只是在第 11 位。我只想从 0 开始;

我可以使用 for 循环来替换所有数据,但我真的认为有一种方法可以清空ArrayList. 是吗?

4

7 回答 7

67

你的假设似乎不正确。在 a 之后clear(),新添加的数据从索引 0 开始。

于 2013-01-12T12:26:12.287 回答
26

如果您有任何疑问,请查看 JDK 源代码

ArrayList.clear()源代码:

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

您将看到它size设置为 0,因此您从 0 位置开始。

请注意,在向 中添加元素时ArrayList,后端数组被扩展(即,如果需要,数组数据被复制到更大的数组中)以便能够添加新项目。执行时ArrayList.clear(),您只删除对数组元素的引用并设置size为 0,但是,capacity保持原样。

于 2013-01-12T12:30:42.843 回答
10

ArrayList.clear(来自Java 文档):

从此列表中删除所有元素。此调用返回后列表将为空

于 2013-01-12T12:27:59.870 回答
9

之后data.clear()肯定会从零索引重新开始。

于 2014-07-13T11:31:30.230 回答
8

data.removeAll(data);会做的工作,我想。

于 2013-01-12T12:25:46.940 回答
5

clear()函数清除 Arraylist 并从索引 0 开始不是真的

于 2013-01-12T12:29:13.133 回答
3

clear的源码说明了新添加的数据获得首位的原因。

 public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
    }

顺便说一下,clear() 比 removeAll() 快,第一个是 O(n) 而后者是 O(n_2)

于 2013-01-12T12:32:07.617 回答