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