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 ++。