system.arraycopy不能直接实现多维数组深拷贝,因其仅复制引用;需分层创建新数组并逐行调用arraycopy完成深拷贝,对象数组还需处理可变对象的独立实例化。

System.arraycopy 不能直接完成多维数组的深拷贝,它只负责一维内存块的搬运。处理 int[][]、String[][] 等多维数组时,必须理解其“数组的数组”本质,再分层调用 arraycopy —— 外层复制引用,内层逐行复制内容。
多维数组在 JVM 中的真实结构
Java 没有真正的“二维数组”,int[][] 实际是一个一维引用数组,每个元素指向一个独立的一维 int[]。System.arraycopy 对它操作时,只复制这些“指向子数组的引用”,不触及子数组内部数据。因此 dst[0] == src[0] 为 true,修改 dst[0][1] 会同步改变 src[0][1]。
二维数组深拷贝的两步法
要让目标数组完全独立,需手动控制内存分配与数据搬运:
- 先创建外层容器:int[][] dest = new int[src.length][];
- 再遍历每一行:必须判空,避免 NullPointerException
- 为每行单独分配新子数组:dest[i] = new int[src[i].length];
- 对每行调用 System.arraycopy:System.arraycopy(src[i], 0, dest[i], 0, src[i].length);
三维及以上数组的扩展逻辑
int[][][] 可看作“二维数组的数组”,复制逻辑是二维方案的自然延伸:
- 新建最外层数组:int[][][] dest = new int[src.length][][];
- 对每个 src[i](即一个 int[][]),重复二维深拷贝流程
- 每层都只用 arraycopy 搬运最内层基本类型数组,中间层靠循环 + new 构建
- 无需递归函数,嵌套 for 循环即可清晰表达各维控制流
对象数组的额外注意事项
String[][] 虽然也用 arraycopy 浅拷贝引用,但因 String 不可变,共享无副作用;而 ArrayList[][] 或自定义可变对象数组则不同:
- arraycopy 后 dst[i] 和 src[i] 指向同一 ArrayList 实例
- add/remove 操作会双向污染
- 真正深拷贝需配合 clone()、构造新实例或序列化反序列化
- 类型兼容性仍受 Java 协变规则约束:Object[][] 可接 String[][],但反过来会抛 ArrayStoreException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











