Java通过创建新实例来清除列表

时间:2011-08-31 13:36:10

标签: java performance list arraylist new-operator

我正在查看Java代码,我遇到了这段代码:

list = new ArrayList();
uselist(list);

if (condition)
   list = new ArrayList();

与简单地使用ArrayLists的clear()方法相比,有什么用呢。

使用new命令清除列表是否正常,是否比清除列表更快?

我正在使用java版本1.6

5 个答案:

答案 0 :(得分:9)

不,他们不做同样的事情。方法clear()清除现有的列表 - 任何仍然具有列表引用并稍后查看它的内容将会看到它是空的。

使用 new 关键字的方法会更改list变量的值,但不对现有的ArrayList 对象执行任何操作 - 因此,其他任何东西都引用同一个对象,他们不会看到任何变化。

答案 1 :(得分:9)

请注意清除和重新实例化列表并不是一回事!

考虑这个例子:

a = new ArrayList();
a.add("Hello")
b = a;
a = new ArrayList();   // a is now empty while b contains hello!

对战

a = new ArrayList();
a.add("Hello")
b = a;
a.clear();            // Both a and b are now empty.

如果副作用(共享引用)不是问题,那么只有两种清除列表的方法。它应该不是性能问题,除非这被称为数百万次。

答案 2 :(得分:3)

如果在其他地方使用该列表,则调用clear()可能会导致副作用。 但是,如果不是这种情况,我会说创建一个新列表而不是清除旧列表可能更快(但是,可能仅适用于大型列表,因为ArrayList' s clear()只是迭代元素并将它们设置为null),但很可能只是编程风格的问题。

答案 3 :(得分:2)

它是否相同它取决于uselist(...)在列表内部的作用。

例如,假设您在uselist中包含以下代码:

public void uselist(List l) {
    this.mylist = l;
}

在这种情况下,您的代码将创建一个新列表,而不是触摸this.mylist。如果您在其上调用.clear(),则表示您正在清除相同的列表。

答案 4 :(得分:0)

差异可能是致命的,很难看出来。例如,hibernate将使用list = new ArrayList();然后尝试更新数据库中的列表,但它可以正常使用clear()作为hibernate然后可以看到连接。

clear() // operates on your old object 

list = new ArrayList(); // list will be a new object the old will be GCed