我正在查看Java代码,我遇到了这段代码:
list = new ArrayList();
uselist(list);
if (condition)
list = new ArrayList();
与简单地使用ArrayLists的clear()方法相比,有什么用呢。
使用new命令清除列表是否正常,是否比清除列表更快?
我正在使用java版本1.6
答案 0 :(得分:9)
使用 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