清除ArrayList的两个选项中哪一个更好更快,为什么?
list.clear()
Run Code Online (Sandbox Code Playgroud)
要么
list = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
碰巧我必须在随机的时间清除我的ArrayList中的所有条目,我无法知道将来会有多少新条目,可能有0或1000.哪种方法更快更好,为什么?
dfb*_*dfb 74
没有基准测试很难知道,但如果你的ArrayList中有很多项目并且平均大小较低,那么创建一个新的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;
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*hes 25
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
Run Code Online (Sandbox Code Playgroud)
这里mylist被清除了,对它所持有的元素的引用被删除了,但它保留了相同的后备数组.然后mylist重新初始化并得到一个新的后备阵列,旧的得到了GCed.因此,一种方式保留在内存中,另一种方式抛出其内存并从头开始重新分配(使用默认容量).哪个更好取决于您是否要减少垃圾收集流失或最小化当前未使用的内存量.列表是否足够长以便移出伊甸园可能是决定哪个更快的一个因素(因为这可能使垃圾收集更加昂贵).
Ste*_*n C 19
我认为答案是它取决于一系列因素,例如:
这些使得很难预测哪个更好.但我的直觉是差异不会那么大.
两点建议:
不要浪费时间尝试优化这个...除非应用程序客观上太慢>>和<<分析器告诉你这是一个性能热点.(很可能这些先决条件中的一个或另一个不是真的.)
如果你决定优化它,那就科学地做.尝试两种(所有)备选方案,并通过在实际问题/工作负载/输入集上测量实际应用程序的性能来确定哪种方案最佳.(由于上面列出的因素,人工基准测试不太可能为您提供可以使用的答案.)
RMT*_*RMT 15
第一个.clear();将保持相同的列表清除列表.
第二个在内存中new ArrayList<Integer>();创建一个新ArrayList的.
建议:首先是因为这就是设计目的.
小智 5
尝试了以下程序,同时采用了两种方法。1.在for循环中清除arraylist obj。2.在for循环中创建新的New Arraylist。
List al= new ArrayList();
for(int i=0;i<100;i++)
{
//List al= new ArrayList();
for(int j=0;j<10;j++)
{
al.add(Integer.parseInt("" +j+i));
//System.out.println("Obj val " +al.get(j));
}
//System.out.println("Hashcode : " + al.hashCode());
al.clear();
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是 内存分配没有太大变化。
使用新的Arraylist方法。
循环前总可用内存:64,909 ::
After循环后的总可用内存:64,775 ::
采用清晰的方法
循环前总可用内存:64,909 ::循环后总可用内存:64,765 ::
因此,从内存利用率的角度来看,使用arraylist.clear并没有太大区别。
| 归档时间: |
|
| 查看次数: |
139541 次 |
| 最近记录: |