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

nst*_*sic 23 java memory android arraylist

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

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

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

[1000] (int) 32

[1002] (int) 12

[1003] (float) 2.5
Run Code Online (Sandbox Code Playgroud)

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

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

Kar*_*k T 13

你是对的,因为内存是由垃圾收集器异步清除的,而不是由这些库函数直接清除.clear只会null全部出局,并相应地更新ArrayList状态.

如果任何或所有这些元素未被代码的任何其他部分引用,则它们有资格进行垃圾收集,并且可能在该调用之后不久的任何时间被销毁或取消分配.


Evg*_*eev 5

clear 仅支持数组元素

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

但如果我们调用ArrayList.trimToSize after clear支持数组将收缩

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


Sur*_*tta 5

不,它不会清除记忆clear().在你之后.

查看clear()的源代码

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

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

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