使用Java(1.6)最好是在List上调用clear()方法还是只重新实例化引用?
我有一个ArrayList,它填充了未知数量的对象并定期“刷新” - 处理对象并清除List。刷新后,List再次填满。冲洗是在随机时间发生的。列表中的数字可能很小(对象的10个)或大的(数百万个对象)。
所以最好让“flush”调用clear()或new ArrayList()吗?
是否值得担心这类问题,还是我应该让VM担心呢?我怎样才能看看Java的内存占用为我自己做这类事情?
非常感谢任何帮助。
答案 0 :(得分:32)
需要关注的主要问题是其他代码可能对列表有引用。如果现有列表在其他地方可见,您是否希望该代码查看已清除的列表,或保留现有列表?
如果没有别的东西可以看清单,我可能只是清楚它 - 但不是出于性能原因;仅仅因为您描述操作声音的方式更像是清除而不是“创建新列表”。
ArrayList<T>
文档没有指定底层数据结构会发生什么,但是看一下Eclipse中的1.7实现,看起来你应该在trimToSize()
之后调用clear()
- 否则你仍然可以拥有一个由大量空引用支持的列表。 (当然,这对你来说可能不是问题......也许这比随着大小再次增加来复制数组更有效。你会比我们更了解这个。)
(当然创建一个新列表不需要旧列表将所有数组元素设置为null ...但我怀疑这在大多数情况下会很重要。)
答案 1 :(得分:2)
答案 2 :(得分:1)
我认为如果Arraylist太频繁地被冲洗,就好像它在循环中连续运行或者某些东西那么更好地使用清除如果冲洗不是太频繁那么你可以创建一个新实例。也因为你说元素可能从10个对象到数百万不等,你可以为你创建的每个新Arraylist中间的大小,这样arraylist可以避免调整大量的时间。
答案 3 :(得分:0)
list.clear()没有新XXList的优势。 以下是我对比较绩效的调查。
import java.util.ArrayList;
import java.util.List;
public class ClearList {
public static void testClear(int m, int n) {
List<Integer> 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<Integer> 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
*/