2013-08-30 86 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.