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

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

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

那么“flush”调用clear()或new ArrayList()会更好吗?

是否值得担心这类问题,还是我应该让VM担心呢? 我怎样才能看看Java的内存占用为我自己做这类事情?

任何帮助非常感谢。

需要关注的主要问题是其他代码可能会引用该列表。 如果现有列表在其他位置可见,您是否希望该代码查看已清除的列表,或保留现有列表?

如果没有别的东西可以看清单,我可能只是清楚它 – 但不是出于性能原因; 只是因为你描述操作的方式听起来更像清理而不是“创建新列表”。

ArrayList docs没有指定底层数据结构会发生什么,但是看看Eclipse中的1.7实现,看起来你应该在clear()之后调用trimToSize() clear() – 否则你仍然可以有一个列表支持通过大量的空引用。 (也许这对你来说不是问题,当然……也许这比随着大小再次复制而复制数组更有效。你会比我们更了解这个。)

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

您使用它的方式与使用Queue的方式非常相似。 当您处理队列中的项目时,它们会在您处理它们时被删除。

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

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

我认为如果Arraylist太频繁地被冲洗,就好像它在循环中持续运行或者某些东西那么更好地使用清除如果冲洗不是太频繁那么你可以创建一个新实例。也因为你说元素可能从10变化对于数以百万计的人,你可以为你创建的每个新的Arraylist寻找中间大小,这样arraylist可以避免调整大量的时间。

list.clear()没有新XXList的优势。 这是我比较性能的调查。

  import java.util.ArrayList; import java.util.List; public class ClearList { public static void testClear(int m, int n) { List list = new ArrayList<>(); long start = System.currentTimeMillis(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { list.add(Integer.parseInt("" + j + i)); } list.clear(); } System.out.println(System.currentTimeMillis() - start); } public static void testNewInit(int m, int n) { List list = new ArrayList<>(); long start = System.currentTimeMillis(); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { list.add(Integer.parseInt("" + j + i)); } list = new ArrayList<>(); } System.out.println(System.currentTimeMillis() - start); } public static void main(String[] args) { System.out.println("clear ArrayList:"); testClear(991000, 100); System.out.println("new ArrayList:"); testNewInit(991000, 100); } } /*--* * Out: * * clear ArrayList: * 8391 * new ArrayList: * 6871 */