为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2019-11-12 12:45:53
清除ArrayList的两个选项中哪个更好,更快,为什么?list.clear() 要么list = new ArrayList<Integer>();碰巧,我不得不随机地从ArrayList中清除所有条目,而我无法知道将来会有多少个新条目,可能是0或1000。哪种方法更快,更好,为什么呢?
查看完整描述

3 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-11-12
?
倚天杖

TA贡献1828条经验 获得超3个赞

我认为答案是取决于一系列因素,例如:

  • 是否可以预先预测列表大小(即您可以准确设置容量),

  • 列表大小是否可变(即每次填充),

  • 两种版本的清单寿命将有多长,以及

  • 您的堆/ GC参数和CPU。

这些使得很难预测哪个会更好。但是我的直觉是,差别不会太大。

关于优化的两个建议:

  • 不要浪费时间尝试优化它……除非应用程序客观上太慢,并且使用探查器进行的测量告诉您这是性能热点。(这些先决条件之一可能不成立。)

  • 如果您决定优化此设置,请科学地进行。尝试这两种(所有)替代方法,并通过对实际问题/工作负载/输入集进行实际应用中的性能测量来确定最佳选择。(由于我之前列出的因素,人为基准可能会给您提供无法预测现实世界行为的答案。)


查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 831 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信