为什么我通过以下方式得到不同的行为:
Collection col2 = new ArrayList(col);
Collection col2 = new ArrayList();
col2.addAll(col)
我正在与查看者一起工作,并且代码很复杂,并且我试图解释问题的“根源”。另一个有趣的事实是下一个...
//IF i use this code i have the correct behavior in my app:
public void updateCollection(Collection<Object> col) {
this.objectCollection.clear();
this.objectCollection.addAll(col);
}
//IF i use this code i have unexpected behavior in my app:
public void updateCollection(Collection<Object> col) {
this.objectCollection=new ArrayList(col);
}
最佳答案
此代码有效:
public void updateCollection(Collection<Object> col) {
this.objectCollection.clear();
this.objectCollection.addAll(col);
}
但这带来了问题:
public void updateCollection(Collection<Object> col) {
this.objectCollection=new ArrayList(col);
}
我怀疑您的第一种方法的这种变化会带来相同的问题:
public void updateCollection(Collection<Object> col) {
this.objectCollection = new ArrayList();
this.objectCollection.clear();
this.objectCollection.addAll(col);
}
为什么?显然,您在某处使用了另一个对objectCollection的引用。在代码中的某个地方,另一个对象在说(例如):
myCopyOfObjectCollection = theOtherObject.objectCollection;
如果您使用的是 setter/getter ,则不会改变其基本行为-您仍在保留其他引用。
因此,如果在初次分配时,假设该集合包含{1、2、3},那么您将从:
当您向this.objectCollection分配一个新的ArrayList并使用{4,5,6}进行填充时,您将获得以下信息:
“that”仍指向原始ArrayList。
关于java - Java addAll(collection)与新的ArrayList(collection),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4238654/