Java 多维阵列的克隆

Java 多维阵列的克隆,java,Java,我天真地以为这会奏效。但是它没有——它只克隆了第一个维度,如果我想要一个真正的克隆,我必须去手动克隆另一个维度。注意:内容已正确复制。但是当我更改克隆[0][1]时,它反映在数组[0][1] 虽然大家都知道.clone()可以执行浅层克隆,int[][]看起来就像一个对象(至少我们不知道它的内部实现) 为什么选择这种行为?int[][]不是引用数组对象,而不仅仅是数组的第一个维度吗?在什么样的情况下,克隆仅仅是第一个维度的行为 为什么选择这种行为 很可能是一致性 正如您所说,int[][]引用数

我天真地以为这会奏效。但是它没有——它只克隆了第一个维度,如果我想要一个真正的克隆,我必须去手动克隆另一个维度。注意:内容已正确复制。但是当我更改
克隆[0][1]
时,它反映在
数组[0][1]

虽然大家都知道
.clone()
可以执行浅层克隆,
int[][]
看起来就像一个对象(至少我们不知道它的内部实现)

为什么选择这种行为?
int[][]
不是引用数组对象,而不仅仅是数组的第一个维度吗?在什么样的情况下,克隆仅仅是第一个维度的行为

为什么选择这种行为

很可能是一致性

正如您所说,
int[][]
引用数组对象。每个数组元素的内容恰好是另一个数组,但这只是一个细节。Java以相同的方式克隆所有数组,而且由于元素可以是任何类型,因此不能保证执行深度复制

因此,数组的
clone()
执行浅层复制,因此只克隆第一个维度


(一般来说,对于克隆意味着深度拷贝还是浅拷贝的问题,似乎没有一个“最佳”或“明显”的答案。开发人员想要什么将取决于应用程序如何使用每个字段,因此“一刀切”的方法自然会有局限性。)

演示此行为是因为没有真正的多维数组

Java通过创建数组的数组来实现多维度。这意味着:

int[][] array = new int[][] {...}
int[][] clone = array.clone();
int[][]实际上是数组
因此,克隆将只复制第一个维度


如果尝试使用三维数组,则需要克隆三次。

克隆
方法是所谓的浅层复制(请参阅),这意味着所有元素都是通过引用复制的

要获得所需的内容(也称为深度克隆),您可以使用
数组自己复制每个数组。递归复制
,这样您找到的每个(子)数组都将获得深度克隆,或者进行检查


Happy hacking:-)

我实际上无法复制您提到的行为。我可以看到一些答案提到浅拷贝是问题的根本原因。如果我错了,请纠正我,浅拷贝只是意味着在克隆时,我们将获得引用的拷贝,而不是对象的拷贝。这里可以找到一个很好的解释

在这种情况下,浅层复制只会确保原始阵列中的更改反映在克隆阵列中,而不会阻止任何内容的复制

int[][] is actually Array<Array<int>>
int[][]数组=新的int[][{{1,2,3},{4,5,6},{7,8,9};
int[]clone=array.clone();
//试试看浅拷贝的魔力
//数组[2][1]=11;
对于(int i=0;i
  • java中的数组实际上是一个对象
  • 现在结合1和2,我们知道Java中的多维数组只是一个对象,它引用了其他数组对象

    类似于ArrayObj->{ArrayObj,ArrayObj,ArrayObj}


    因为我们在对象(组合)中有对象,所以根据Java克隆规则,我们应该得到一个浅拷贝。

    我要澄清一下。克隆确实发生了,但并不深入。
    int[][] array = new int[][] {{1,2,3},{4,5,6}, {7,8,9}};
    int[][] clone = array.clone();
    
    //Try this to see magic of shallow copy
    //array[2][1]=11;
    
    for(int i=0;i<array.length;i++)
        for(int j=0;j<array[i].length;j++)
            System.out.println("array["+i+"]["+j+"]"+array[i][j]);
    
    for(int i=0;i<clone.length;i++)
        for(int j=0;j<clone[i].length;j++)
            System.out.println("clone["+i+"]["+j+"]"+clone[i][j]);