我实际上无法复制您提到的行为。我可以看到一些答案提到浅拷贝是问题的根本原因。如果我错了,请纠正我,浅拷贝只是意味着在克隆时我们将获得引用的副本,而不是对象的副本。一个很好的解释可以在这里找到In Java, what is a shallow copy?
在这种情况下,浅拷贝只会确保原始数组中的更改会反映在克隆的数组中,但不会阻止任何内容被复制。
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]);
对我来说,克隆非常完美,即两个数组具有相同的内容。我能想到得到克隆数组不会显示某些信息的问题的唯一原因是我们实际上在克隆后修改了原始数组(然后是浅拷贝)。
顺便说一句,我使用的是 Java 1.6,我希望这不是问题。
编辑:如果我们只需要了解为什么它们是多维数组的浅拷贝而不是深拷贝。让我们看两个事实
- 在克隆时,对象总是被克隆为浅拷贝(对象引用的拷贝),只有本机类型才会得到真正的拷贝。 In Java, what is a shallow copy?
- java中的数组其实是一个对象Is an array an object in java
现在结合1和2,我们知道Java中的多维数组只是一个对象,它具有其他数组对象的引用。
类似 ArrayObj->{ArrayObj, ArrayObj, ArrayObj};
因为我们在对象(组合)中有对象,所以我们应该根据 Java 克隆规则获得浅拷贝。