ArrayList.clear() 方法是否释放内存?

2022-09-01 17:37:11

如果我没有记错的话,ArrayList 包含存储已添加到 List 的变量的内存位置的值。所以,我的假设是,当你调用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 仍将包含以前给定的值。我错了吗?


答案 1

您是正确的,因为内存由垃圾回收器异步清除,而不是由此类库函数直接清除。 只会把它们全部拿出来,并相应地更新状态。clearnullArrayList

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


答案 2

clear仅为支持数组元素的空值

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

但是如果我们调用支持数组会收缩ArrayList.trimToSizeafter clear

public void trimToSize() {
    modCount++;
    int oldCapacity = elementData.length;
    if (size < oldCapacity) {
        elementData = Arrays.copyOf(elementData, size);
    }
}