list.clear() vs list = new ArrayList<Integer>();

2022-08-31 08:08:46

2个选项中哪一个更好,更快地清除ArrayList,为什么?

list.clear() 

list = new ArrayList<Integer>();

碰巧我必须在随机时间清除我的ArrayList中的所有条目,并且我无法知道将来会有多少个新条目,可能有0或1000。哪种方法更快更好,为什么?


答案 1

如果没有基准测试,很难知道,但是如果您的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;
}

答案 2

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。因此,一种方式保留内存,另一种方式丢弃其内存并从头开始重新分配(使用默认容量)。哪个更好取决于您是要减少垃圾回收改动还是最小化当前未使用的内存量。列表是否停留足够长的时间以移出伊甸园可能是决定哪个更快(因为这可能会使垃圾收集更加昂贵)的一个因素。


推荐