2013-08-30 55 views
15

如果我没有弄错,ArrayList包含存储位置的值,其中存储了添加到列表中的变量。所以,我的假设是,当你调用ArrayList.clear()方法时,它只释放前面提到的值(内存位置),但不会释放这些内存位置本身。我会尽力来说明这一个例子: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仍将包含先前给定的值。我错了吗?

+2

http://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which-one-will-be-better可以帮助你 –

+2

请注意,'ArrayList'永远不会包含像'int'这样的基本类型,但是像Integer这样的对象。这最终对于答案是相当重要的。 –

回答

7

你是对的,因为内存被垃圾收集器异步清除,而不是直接被这些库函数清除。 clear将只有null他们全部出来,并相应地更新ArrayList状态。

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

+0

谢谢我会确保我手动处理丢弃的变量:)干杯和漂亮的化身 – NitroNbg

+0

@NitroNbg,应该没有必要手动做任何事情,只要他们没有被引用,他们将被分配。并感谢:) –

5

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

这最终,在这个问题的背景下,浪费空间不是吗?由于它现在不仅是清除的元素,而且还是处于GC边界的Array本身 –

3

不,它不会清除memory.After你clear()

见的明确()

public void More ...clear() { 
474   modCount++; 
475 
476   // Let gc do its work 
477   for (int i = 0; i < size; i++) 
478    elementData[i] = null; 
479 
480   size = 0; 
481  } 

的源代码的方法,是使符合垃圾Collector.Not立即清除它们的元素。一旦GC运行,他们就消失了。

1

您的问题的答案,它不会释放内存。它将只删除所有的对象引用。现在,这些对象可能会或可能不会被垃圾收集器收集,这取决于它们在其他地方的引用方式。 例如, 对象1是指 - >对象2 ArrayList中是指 - >对象2 ArrayList中是指 - >对象3

在这种情况下,Arraylist.clear()后,对象3将有资格获得的清理但不是对象2.