将阵列复制到另一个阵列

时间:2013-06-01 15:19:13

标签: java arrays copy

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

我的代码:

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

3 个答案:

答案 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)

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

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

http://dozer.sourceforge.net/