int[][] array = new int[][] {...}
int[][] clone = array.clone();
我天真地期望这会起作用。但它没有——它只克隆了第一个维度,如果我想要一个真正的克隆,我必须去手动克隆另一个维度。注意:内容已正确复制。但是当我更改 clone[0][1]
时,它反射(reflect)在 array[0][1]
虽然众所周知 .clone()
可以执行浅克隆,但 int[][]
看起来像一个单独的对象(如果我们不知道它的内部实现,至少)
为什么选择这种行为? int[][]
引用的不是数组对象,而不仅仅是数组的第一维吗?在什么情况下仅克隆所需行为的第一个维度?
最佳答案
Why is that behaviour chosen?
一致性,最有可能。
正如您所说,int[][]
引用了一个数组对象。恰好每个数组元素的内容是另一个数组,但这只是一个细节。 Java 以相同方式克隆所有数组,并且由于元素可以是任何类型,因此无法保证执行深层复制。
因此 clone()
对数组执行浅拷贝,因此仅克隆第一个维度。
(一般来说,对于克隆是否意味着深拷贝或浅拷贝的问题,似乎没有单一的“最佳”或“明显”答案。开发人员想要什么将取决于每个字段如何被使用应用程序,因此一刀切的方法自然会有局限性。)
关于java - 克隆多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16186141/