重新实例化列表或调用 clear() 的更好做法

2022-09-01 04:37:59

使用Java(1.6)是在List上调用clear()方法还是只是重新实例化引用更好?

我有一个ArrayList,它填充了未知数量的对象并定期“刷新” - 其中处理对象并清除列表。刷新后,列表将再次填满。刷新发生在随机时间。列表中的数字可能很小(10 个对象)或很大(数百万个对象)。

那么让“flush”调用clear()还是新的ArrayList()更好?

是否值得担心此类问题,或者我应该让 VM 担心它?我怎么能去看看Java的内存占用来为自己解决这种事情呢?

任何帮助都非常感谢。


答案 1

要关注的主要问题是其他代码可能对列表的引用。如果现有列表在其他地方可见,是希望该代码看到已清除的列表,还是保留现有列表?

如果没有其他人可以看到该列表,我可能会清除它 - 但不是出于性能原因;只是因为您描述操作的方式听起来更像是清除而不是“创建新列表”。

这些文档没有指定底层数据结构会发生什么,但看看Eclipse中的1.7实现,看起来你应该在之后调用 - 否则你仍然可以有一个由大量空引用数组支持的列表。(当然,也许这对你来说不是问题...也许这比在大小再次增加时必须复制数组更有效。您将比我们更了解这一点。ArrayList<T>trimToSize()clear()

(当然,创建新列表不需要旧列表将所有数组元素设置为 null...但我怀疑这在大多数情况下是否重要。


答案 2

您使用它的方式看起来非常类似于队列的使用方式。当您处理队列中的项目时,它们会在您处理它们时被删除。

使用其中一个 Queue 类可能会使代码更加优雅。

还有一些变体以可预测的方式处理并发更新。