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

时间:2013-08-30 08:12:54

标签: java android memory arraylist

如果我没弄错的话,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仍将包含先前给定的值。我错了吗?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:5)

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);
    }
}

答案 2 :(得分: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;
    }

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

答案 3 :(得分:2)

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

例如,

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

在这种情况下,在Arraylist.clear()之后,对象3将有资格获得clean-up但不符合对象2.