26

如果我没记错的话,ArrayList 包含存储您添加到列表中的变量的内存位置的值。因此,我的假设是,当您调用 ArrayList.clear() 方法时,它只会释放上述值(内存位置),但不会释放这些内存位置本身。我将尝试用一个例子来说明这一点:

假设您有当前的内存状态:

[Memory location] (type of variable) *value*

[1000] (int) 32

[1002] (int) 12

[1003] (float) 2.5

然后将它们添加到列表 myList 中,因此它包含指向 1000、1002、1003 内存位置的指针。

当您调用 myList.clear() 时,指针将无效,但内存位置 1000、1002、1003 仍将包含先前给定的值。我错了吗?

4

4 回答 4

15

您是正确的,因为垃圾收集器异步清除内存,而不是直接由此类库函数清除。clear只会将null它们全部清除,并ArrayList相应地更新状态。

如果您的代码的任何其他部分未引用任何或所有这些元素,则它们将有资格进行垃圾回收,并且可能会在调用后不久到时间结束的任何时间被销毁+取消分配。

于 2013-08-30T08:16:37.477 回答
6

clear只有空支持数组元素

public void clear() {
    modCount++;
    for (int i = 0; i < size; i++)
        elementData[i] = null;
    size = 0;
}

但是如果我们调用ArrayList.trimToSize after clear后备数组会缩小

public void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (size < oldCapacity) {
        elementData = Arrays.copyOf(elementData, size);
    }
}
于 2013-08-30T08:19:20.657 回答
6

不,它不会清除内存。在你之后clear()

查看 clear() 的源代码

 public void More ...clear() {
    modCount++;

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

该方法使元素符合垃圾收集器的条件。不立即清除它们。一旦 GC 运行,它们就消失了。

于 2013-08-30T08:19:21.283 回答
2

你的问题的答案,它不会FREE记忆。它只会删除所有object references. 现在,这些对象可能会或可能不会被收集器收集,garbage具体取决于它们在其他地方的引用方式。

例如,

Object 1 refers - > Object 2
ArrayList refers - > Object 2
ArrayList refers - > Object 3

在这种情况下,在 之后Arraylist.clear(),对象 3 将符合条件,clean-up但不符合对象 2。

于 2013-08-30T08:27:56.523 回答