我的代码:
class cPrueba {
private float fvalor;
public float getFvalor() {
return fvalor;
}
public void setFvalor(float fvalor) {
this.fvalor = fvalor;
}
}
List<cPrueba> tListaPrueba = new ArrayList<cPrueba>();
List<cPrueba> tListaPrueba2 = new ArrayList<cPrueba>();
cPrueba tPrueba = new cPrueba();
tPrueba.setFvalor(50);
tListaPrueba.add(tPrueba);
tListaPrueba2.addAll(tListaPrueba);
tListaPrueba2.get(0).setFvalor(100);
System.out.println(tListaPrueba.get(0).getFvalor());
结果是“100.0”......
仍然指向同一个对象......任何简短的复制方式? (不包括(..){})
编辑:
class cPrueba implements Cloneable {
private float fvalor;
public float getFvalor() {
return fvalor;
}
public void setFvalor(float fvalor) {
this.fvalor = fvalor;
}
public cPrueba clone() {
return this.clone();
}
}
List<cPrueba> tListaPrueba = new ArrayList<cPrueba>();
List<cPrueba> tListaPrueba2 = new ArrayList<cPrueba>();
cPrueba tPrueba = new cPrueba();
tPrueba.setFvalor(50);
tListaPrueba.add(tPrueba);
for ( cPrueba cp : tListaPrueba )
tListaPrueba2.add(cp);
tListaPrueba2.get(0).setFvalor(100);
System.out.println(tListaPrueba.get(0).getFvalor());
仍然得到100 ......
答案 0 :(得分:5)
如果您的对象本身没有深层复制支持,则无法对数组或任何类型的Collection
(包括List
)甚至Map
进行“深度复制”(例如,通过复制构造函数)。
那么,对你的问题:
任何简短的复制方式? (不包括(..){})
答案是否定的。
当然,如果您的对象是不可变的,那么这不是一个问题。
答案 1 :(得分:1)
就像dystroy说的那样,你需要通过循环并克隆所有对象,如下所示:
List<cPrueba> newList = new ArrayList<cPrueba>();
for ( cPrueba cp : oldList )
newList.add(cp.clone());
这假设您的对象实现了Cloneable,或者至少有一个名为clone的方法。
所以不,没有简短的方法(除非你编写自己的静态方法),但它是可能的。
EDIT 您需要克隆方法来返回新的cPrueba:
public cPrueba clone() {
cPrueba c = new cPrueba();
c.setFvalor(this.getFvalor());
return c;
}
另外,请务必在for循环中调用cp.clone()
;不要只是将cp传递给add方法。例如,改变
tListaPrueba2.add(cp);
到
tListaPrueba2.add(cp.clone());
答案 2 :(得分:0)