【问题标题】:How to properly copy an object in java?如何在java中正确复制对象?
【发布时间】:2013-01-13 12:00:11
【问题描述】:

我参与了这个小项目,我花了大约 20 个小时来解决(没有任何运气或结果)代码中的一个主要问题。现在我发现真正的问题是 copy() 函数不能正常工作。

我做错了什么?

这是我针对具体问题做的例子:

package cloneobject;

import java.util.Arrays;

public class CloneObject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        clone(new int[3][3]);
    }

    public static void clone(int[][] x) {
        int[][] y = (int[][]) x.clone();
        System.out.println("x=");
        PrintFieldImage(x);
        System.out.println("y=");
        PrintFieldImage(y);
        x[1][1] = 3;        
        System.out.println("x=");
        PrintFieldImage(x);
        System.out.println("y=");
        PrintFieldImage(y);
        y[2][2] = 4;
        System.out.println("x=");
        PrintFieldImage(x);
        System.out.println("y=");
        PrintFieldImage(y);
    }

    public static void PrintFieldImage(int[][] field) {
        if (field != null) {
            int x;
            for (x = 0; x < field.length; x++) {
                System.out.println(Arrays.toString(field[x]));
            }
        } else {
            System.out.println("no field!");
        }
    }
}

结果如下:

run:
x=
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
y=
[0, 0, 0]
[0, 0, 0]
[0, 0, 0]
x=
[0, 0, 0]
[0, 3, 0]
[0, 0, 0]
y=
[0, 0, 0]
[0, 3, 0]
[0, 0, 0]
x=
[0, 0, 0]
[0, 3, 0]
[0, 0, 4]
y=
[0, 0, 0]
[0, 3, 0]
[0, 0, 4]
BUILD SUCCESSFUL (total time: 0 seconds)

现在我希望 x 包含 3,y 包含 4。

请帮忙!

【问题讨论】:

  • 二维数组其实就是数组的数组,所以数组的每一行都是自己的引用变量。您还需要将这些复制到新数组中以避免这个问题,即深拷贝。

标签: java arrays multidimensional-array


【解决方案1】:

clone() 只会做一个浅克隆。您正在克隆一个二维数组;数组数组。只有顶层数组会被克隆。如果您想进行深度克隆,则必须使用老式的 for 循环。

int[][] y = new int[x.length][];
for(int i=0; i<x.length; i++) {
    y[i] = x[i].clone();
}

另见copy a 2d array in java

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-26
    • 2018-07-05
    • 2011-07-25
    • 2014-12-24
    • 2014-05-12
    相关资源
    最近更新 更多