2014-01-10 61 views
1

有沒有辦法執行以下操作,而無需調用垃圾回收或增加堆大小以避免最終的GC?如何在不調用垃圾回收的情況下覆蓋ArrayList

List<Long> someList = new ArrayList<Long>(); 
someList.add(1l); 
someList = new ArrayList<Long>(); //Will this cause GC of the old `someList`? 

那麼,我問的是,如果原來的ArrayList會被刪除(最終GCD)?如果是這樣,我該如何解決這個問題,以便我可以在沒有GCing的情況下覆蓋原始列表?

+0

是,原來的列表將被刪除和垃圾收集。但是,這不是問題的標題。有什麼你需要知道嗎?順便說一下,爲了便於閱讀,請使用大寫字母L來表示長文字 - 「1L」不會與十一個混淆。 –

+0

ArrayList不是不可變的。事實上,你正在修改它的第二行。 – aalku

+0

你可以使用'list.clear()'方法清除它中的所有節點! – Rugal

回答

2

舊的ArrayList將有資格在第3行進行垃圾回收,前提是沒有其他引用指向它,因爲看起來就是這種情況。但是,不能保證馬上開始使用。

如果你想避免額外創建ArrayList的,你可以簡單地使用List#clear()法明確表示:

someList.clear(); 
+0

有什麼辦法讓對象變爲可變的,以便覆蓋原始數組列表而不是GCing,然後替換? – user2763361

+0

你爲什麼如此害怕GC?什麼是真正的問題? – Axel

+0

分配給一個新的變量? 'List tmp = someList; someList = new ArrayList <>();'現在tmp會保留你的舊someList的強引用,因此將阻止GC表單收集它 –

0

我假設你問題你想保留對舊名單的參考(以及它的內容,否則有什麼意義)?

如果是的話只是之前重新分配給它添加一個參考:

List<Long> someList = new ArrayList<Long>(); 
someList.add(1L); 
List<Long> oldList = someList; 
someList = new ArrayList<Long>();