addAll 添加对 ArrayList 中对象的引用,而不是对象的副本。如果您想要副本,则必须遍历第一个 ArrayList,并且对于每个对象,调用将创建对象副本的“克隆”函数,并将其添加到新的 ArrayList。
例子:
public static void main(String[] args) {
ArrayList<Foo> A = new ArrayList<Foo>();
A.add(new Foo("foo1", 1));
A.add(new Foo("foo2", 2));
ArrayList<Foo> B = new ArrayList<Foo>();
System.out.println("Before: ");
System.out.println("A:");
for(Foo foo:A){
System.out.println(foo);
try {
B.add((Foo)foo.clone());
} catch (CloneNotSupportedException ex) {
//Never Gonna Happen
}
}
System.out.println("B:");
for(Foo foo:B){
System.out.println(foo);
}
A.remove(0);
System.out.println("After:");
System.out.println("A:");
for(Foo foo:A){
System.out.println(foo);
}
System.out.println("B:");
for(Foo foo:B){
System.out.println(foo);
}
}
public static class Foo{
private String Name;
private int Id;
public Foo(String Name, int Id) {
this.Name = Name;
this.Id = Id;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return new Foo(Name,Id);
}
@Override
public String toString() {
return "Name: "+Name+", Id: "+Id;
}
}
这打印出来:
Before:
A:
Name: foo1, Id: 1
Name: foo2, Id: 2
B:
Name: foo1, Id: 1
Name: foo2, Id: 2
After:
A:
Name: foo2, Id: 2
B:
Name: foo1, Id: 1
Name: foo2, Id: 2
如果您处理您创建的类的 ArrayLists,请确保它们都覆盖了“克隆”功能。对于包含您还创建的类的类,请使用您为父类“克隆”中的内部类创建的“克隆”函数。等等。