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中移出,这可能是决定哪个列表更快的一个因素(因为这可能会使垃圾回收变得更加昂贵)。
TA贡献1828条经验 获得超3个赞
我认为答案是取决于一系列因素,例如:
是否可以预先预测列表大小(即您可以准确设置容量),
列表大小是否可变(即每次填充),
两种版本的清单寿命将有多长,以及
您的堆/ GC参数和CPU。
这些使得很难预测哪个会更好。但是我的直觉是,差别不会太大。
关于优化的两个建议:
不要浪费时间尝试优化它……除非应用程序客观上太慢,并且使用探查器进行的测量告诉您这是性能热点。(这些先决条件之一可能不成立。)
如果您决定优化此设置,请科学地进行。尝试这两种(所有)替代方法,并通过对实际问题/工作负载/输入集进行实际应用中的性能测量来确定最佳选择。(由于我之前列出的因素,人为基准可能会给您提供无法预测现实世界行为的答案。)
添加回答
举报