[英]Java clearing a list by creating a new instance
我正在查看Java代码,发现以下代码:
list = new ArrayList();
uselist(list);
if (condition)
list = new ArrayList();
与简单地使用ArrayLists的clear()方法相反,它的用途是什么。
使用new命令清除列表是否可以,并且比清除列表更快吗?
我正在使用Java 1.6版
不,他们做的不一样。 方法clear()清除现有列表-仍然引用该列表的任何内容,以后再查看该列表都会发现它是空的。
使用new关键字的方法会更改list
变量的值,但不会对现有ArrayList
对象产生任何影响-因此,如果其他任何东西都引用了同一对象,则他们将看不到任何更改。
请注意,清除和重新实例化列表不是同一回事!
考虑以下示例:
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.
如果副作用(共享引用)不是问题,那么这只是清除列表的两种方法。 除非被称为数百万次,否则可能不应该是性能问题。
如果该列表在其他地方使用,则调用clear()
可能会导致副作用。 但是,如果不是这种情况,我会说创建一个新列表而不是清除旧列表可能会更快(但是,可能仅适用于大型列表,因为ArrayList
的clear()
只会遍历元素和集合的它们为null
),但很可能只是编程风格的问题。
是否相同,取决于uselist(...)对列表内部进行的操作。
例如,假设您在uselist中具有以下代码:
public void uselist(List l) {
this.mylist = l;
}
在这种情况下,您的代码将创建一个新列表,而不要触摸this.mylist。 相反,如果您对它调用.clear(),那么您正在清除该相同列表。
这种差异可能是致命的,很难看到。 例如, hibernate
将使用list = new ArrayList()
退出。 然后尝试更新数据库中的列表,但是使用clear()休眠时可以正常工作,然后可以看到连接。
clear() // operates on your old object
list = new ArrayList(); // list will be a new object the old will be GCed
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.