clone()对多维数组只做浅拷贝,顶层数组新、子数组共享;因二维数组本质是“一维数组的数组”,clone仅复制引用而非新建int[]实例,故arr1[0]==arr2[0];一维基本类型数组clone似深拷贝因复制值,而多维数组元素为引用类型故仅复制地址;真正独立副本需手动逐行clone或使用Arrays.deepCopy。

Java 中 clone() 对多维数组只做浅拷贝,顶层数组是新的,但所有子数组仍共享同一份内存 —— 修改任一子数组的元素,两个数组都会变。
为什么 clone() 在多维数组上只是浅拷贝
二维数组本质是「一维数组的数组」,外层数组每个元素都是对 int[] 的引用。clone() 只复制了这些引用,没创建新的 int[] 实例。所以:
- arr1 != arr2(顶层数组对象不同)
- arr1[0] == arr2[0](第一行指向同一个 int[])
- arr1[1] == arr2[1](第二行也指向同一个 int[])
一维 vs 多维:行为完全不同
一维基本类型数组(如 int[])用 clone() 看起来像深拷贝,是因为元素是值类型,复制的是数值本身;而多维数组的“元素”是引用类型(int[]),复制的只是地址。
- int[] a = {1,2}; int[] b = a.clone(); → 修改 b 不影响 a
- int[][] x = {{1,2}}; int[][] y = x.clone(); → 修改 y[0][0] 会同步改到 x[0][0]
如何实现真正独立的多维数组副本
必须逐层复制,常见可靠方式有:
- 手动循环 + 每行调用 clone():for (int i = 0; i
- 用 Arrays.copyOf() 替代 clone():dst[i] = Arrays.copyOf(src[i], src[i].length);
- 避免序列化等重方案,除非对象结构复杂且可序列化
- 注意:Arrays.copyOf(arr, len) 对多维数组仍是浅拷贝,不能直接用
容易踩的坑
别以为 clone() 或 copyOf 能自动处理嵌套结构。泛型集合(如 List>)根本不能用 clone(),必须自己写遍历逻辑。另外,Apache Commons Lang 的 ArrayUtils.clone() 对多维数组同样只做浅拷贝。

















