list.clear()vs list = new ArrayList <Integer>();
2个选项中的哪一个更好更快地清除ArrayList,为什么?
list.clear()
要么
list = new ArrayList<Integer>();
碰巧,我必须在随机时间清除我的ArrayList中的所有条目,我无法知道将来有多less新条目,可能有0或1000.哪种方法更快更好,为什么?
没有基准testing就很难知道,但是如果你的ArrayList中有很多项目,并且平均大小较低,那么build立一个新的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; }
List.clear
将删除元素而不减less列表的容量。
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被重新初始化,并得到一个新的支持arrays,旧的得到了GCed。 因此,一种方法保存到内存中,另一种方式抛出内存并从头开始重新分配(使用默认容量)。 哪个更好取决于你想减less垃圾收集stream失还是最小化当前未使用内存的数量。 这份名单是否足够长,以便从伊甸园搬出去,可能是决定哪一个更快的因素(因为这可能会使垃圾收集成本更高)。
我认为答案是取决于一系列因素,例如:
- 是否可以事先预测名单的大小(即你能准确地设定容量),
- 列表大小是否可变,
- 列表的生命周期将在两个版本中持续多久
- 你的堆/ GC参数和CPU。
这使得很难预测哪个更好。 但我的直觉是差异不会那么大。
两点build议:
-
不要浪费时间来优化这个…除非客观上太慢的应用程序>>而且“性能分析器告诉你这是一个性能热点。 (这些先决条件中的一个或者另一个是不可能的)。
-
如果你决定优化这个,科学地做。 尝试两种(全部)替代方法,并通过在实际应用中测量实际问题/工作量/input集合中的性能来确定哪一个最好。 (由于上面列出的因素,人为的基准testing不太可能为您提供可以使用的答案。)
第一个.clear();
将保持相同的清单只是清除列表。
第二个new ArrayList<Integer>();
在内存中创build一个新的ArrayList
。
build议:第一个,因为这是devise要做的。
如果列表中包含的元素很可能包含与清除元素相同的元素,并且如果不需要空闲内存,则清除列表是更好的select。 但我的猜测是,这可能没有关系。 不要试图优化,直到您发现性能问题,并确定它来自哪里。
试了下面的程序,用这两种方法。 1.清除for循环中的arraylist obj 2.在for循环中创build新的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(); }
而令我惊讶的是 内存分配变化不大。
采用新的Arraylist方法。
循环总空闲内存之前:64,909 ::
循环总空闲内存:64,775 ::
用清晰的方法,
前循环总空闲内存:64,909 ::循环总空闲内存:64,765 ::
所以这说从内存利用的angular度来看,使用arraylist.clear没有太大的区别。
list.clear()
将保持相同的ArrayList,但相同的内存分配。 list = new ArrayList<int>();
将为你的ArrayList分配新的内存。
最大的区别是ArrayLists会dynamic扩展,因为你需要更多的空间。 因此,如果调用list.clear()
您仍然可能会为可能不需要的ArrayList分配大量内存。
这就是说list.clear()
会更快,但如果内存maters你可能想分配一个新的ArrayList。
我会build议使用list.clear()而不是分配一个新的对象。 当你调用“新”关键字,你正在创造更多的空间在内存中。 实际上,这并不重要。 我想如果你知道列表有多大,创build一个新的空间可能是一个好主意,但是指定数组的大小。
事实是,除非你正在进行科学编程,否则这是不重要的。 在这种情况下,你需要去学习C ++。