我有一个包含对象的ArrayList
。 (这个对象是类,每个对象都包含非常多的信息,正是这些对象代表了大型发电机,所以逐个复制属性是不可行的)。
示例:
ArrayList arr = {ob1, ob2, ob3, ob4, ob5}
所以我尝试做的是将对象(ob1)克隆到位置5。
arr.set(4, arr.get(0));
但不知怎的,这样做,ob5不是ob ob1的副本,它是ob1,所以如果我改变ob5,ob1也会改变。
这是 ArrayList 固有的东西吗? 如果我使用列表来代替,有什么区别吗?
最佳答案
ArrayList保存引用是的。但您可以克隆它(注意!但这将是浅拷贝 - 它不会克隆内部对象 https://stackoverflow.com/a/13434779/1111527 )
private class JustToCheck implements Cloneable {
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
然后像这样使用
JustToCheck ob1 = new JustToCheck();
JustToCheck ob2 = ob1;
List<JustToCheck> arr = new ArrayList<JustToCheck>();
arr.add(ob1);
arr.add(ob2);
System.out.println(arr.get(0).toString() + ": " + arr.get(1).toString());
try {
arr.set(1, (JustToCheck) ob1.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
System.out.println(arr.get(0).toString() + ": " + arr.get(1).toString());
输出为
example$JustToCheck@1c39a2d: example$JustToCheck@1c39a2d
example$JustToCheck@1c39a2d: example$JustToCheck@bf2d5e
PS - 我已在答案 https://stackoverflow.com/a/13434813/1111527 中检查了该问题
有一些不可变的类
Java6
String a = new String("a");
String b = a;
b += "b";
System.out.println("a = " + a); // a = a
System.out.println("b = " + b); // b = ab
关于java - 将 ArrayList 元素克隆到同一个 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434737/