java list clear 垃圾回收_list.clear()vs list = new ArrayList Integer(); [重复]
問題
這個問題在這里已有答案:
清空一個ArrayList或者只是創(chuàng)建一個新的ArrayList并將舊的那個垃圾收集? [重復] 4個答案
Map.clear()vs new Map:哪一個更好? [重復] 7個答案
清除ArrayList的兩個選項中哪一個更好更快,為什么?
list.clear()
要么
list = new ArrayList();
碰巧我必須在隨機的時間清除我的ArrayList中的所有條目,我無法知道將來會有多少新條目,可能有0或1000.哪種方法更快更好,為什么?
#1 熱門回答(67 贊)
沒有基準測試很難知道,但是如果你的ArrayList中有很多項目并且平均大小較低,那么創(chuàng)建一個新的ArrayList可能會更快。
http://www.docjar.com/html/api/java/util/ArrayList.java.html
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
#2 熱門回答(23 贊)
List.clear將刪除元素而不會降低列表的容量。
groovy:000> mylist = [1,2,3,4,5,6,7,8,9,10,11,12]
===> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
groovy:000> mylist.elementData.length
===> 12
groovy:000> mylist.elementData
===> [Ljava.lang.Object;@19d6af
groovy:000> mylist.clear()
===> null
groovy:000> mylist.elementData.length
===> 12
groovy:000> mylist.elementData
===> [Ljava.lang.Object;@19d6af
groovy:000> mylist = new ArrayList();
===> []
groovy:000> mylist.elementData
===> [Ljava.lang.Object;@2bfdff
groovy:000> mylist.elementData.length
===> 10
這里mylist被清除了,對它所持有的元素的引用被刪除了,但它保留了相同的后備數組。然后mylist重新初始化并得到一個新的后備陣列,舊的得到了GCed。因此,一種方式保留在內存中,另一種方式拋出其內存并從頭開始重新分配(使用默認容量)。哪個更好取決于你是否要減少垃圾收集流失或最小化當前未使用的內存量。列表是否足夠長以便移出伊甸園可能是決定哪個更快的一個因素(因為這可能使垃圾收集更加昂貴)。
#3 熱門回答(15 贊)
我認為答案是它取決于一系列因素,例如:
是否可以預先預測列表的大小(即,你是否可以準確設置容量),
列表大小是否可變,
列表的生命周期在兩個版本中都有多長,和
你的堆/ GC參數和CPU。
這些使得很難預測哪個更好。但我的直覺是差異不會那么大。
兩點建議:
不要浪費時間嘗試優(yōu)化這個...除非應用程序客觀上太慢>>和<
如果你決定優(yōu)化這個,那就科學地做。嘗試兩種(所有)備選方案,并通過在實際問題/工作負載/輸入集上測量實際應用程序的性能來確定哪種方案最佳。 (由于上面列出的因素,人工基準測試不太可能為你提供可以使用的答案。)
總結
以上是生活随笔為你收集整理的java list clear 垃圾回收_list.clear()vs list = new ArrayList Integer(); [重复]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java exception 乱码_ja
- 下一篇: Java减少依赖_去掉JAVA部分依赖的