0

我试图将一个数组的内容复制到另一个数组而不指向相同的内存,但我不能。

我的代码:

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” ....

仍然指向同一个对象......任何简单的复制方法?(没有 for(..){})

编辑:

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...

4

3 回答 3

5

无法“深度复制”数组或任何类型的Collection(包括List),或者即使Map您的对象本身没有深度复制支持(例如,通过复制构造函数)。

所以,对于你的问题:

有什么捷径可以复制吗?(没有 for(..){})

答案是不。

当然,如果你的对象是不可变的,这不是问题。

于 2013-06-01T15:21:44.043 回答
1

就像dystroy说的那样,你需要通过循环并克隆所有对象,如下所示:

List<cPrueba> newList = new ArrayList<cPrueba>();
for ( cPrueba cp : oldList )
    newList.add(cp.clone());

这是假设您的对象实现了 Cloneable,或者至少有一个名为 clone 的方法。

所以不,没有捷径(除非您编写自己的静态方法),但这是可能的。

编辑您需要您的克隆方法来返回一个新的 cPrueba:

public cPrueba clone() {
    cPrueba c = new cPrueba();
    c.setFvalor(this.getFvalor());
    return c;
}

另外,请确保您cp.clone()在 for 循环中调用;不要只将 cp 传递给 add 方法。例如,改变

tListaPrueba2.add(cp);

tListaPrueba2.add(cp.clone());
于 2013-06-01T15:24:08.953 回答
0

vanilla Java 无法为您做到这一点。

但是通过添加一些香料,您可以使用 Dozer 框架完成它:

http://dozer.sourceforge.net/

于 2013-06-01T15:28:54.850 回答