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