System.arraycopy不能直接深拷贝多维数组,因其仅复制引用或连续内存;对int[][]调用只实现浅拷贝,需先复制外层数组容器,再逐行用arraycopy复制子数组内容。

System.arraycopy 不能直接拷贝多维数组的“整个结构”,它只操作一维内存块。要拷贝多维数组,本质是逐维展开、分层处理——关键在于理解多维数组在 JVM 中的存储逻辑(数组的数组),再结合 arraycopy 的高效性做针对性复制。
为什么 System.arraycopy 对二维数组“不直接生效”
Java 中的二维数组(如 int[][])实际是“一维引用数组”,每个元素指向一个一维 int[]。System.arraycopy 只能复制引用或基本类型连续内存,无法递归复制子数组内容。直接对 int[][] 调用 arraycopy,只会复制外层数组中“指向子数组的引用”,造成浅拷贝——新旧数组共享同一组子数组,修改任一子数组都会相互影响。
实现真正的二维数组深拷贝(以 int[][] 为例)
需两步:先用 arraycopy 拷贝外层数组(创建新容器),再对每个子数组单独调用 arraycopy 复制内容:
- 分配新外层数组:int[][] dest = new int[src.length][];
- 遍历 src 的每一行:for (int i = 0; i
- 为 dest[i] 分配新子数组:dest[i] = new int[src[i].length];
- 用 arraycopy 复制该行数据:System.arraycopy(src[i], 0, dest[i], 0, src[i].length);
这样每行都独立分配内存并复制数据,修改 dest 不会影响 src。
立即学习“Java免费学习笔记(深入)”;
三维及以上数组的推广思路
三维数组(如 int[][][])可看作“二维数组的数组”。复制逻辑递进:
- 新建外层容器:int[][][] dest = new int[src.length][][];
- 对每个二维子数组(src[i])重复二维深拷贝流程:先 new int[src[i].length][], 再逐行复制
- 核心不变:arraycopy 始终作用于最内层的一维基本类型数组;中间层靠循环 + new + arraycopy 组合完成
无需递归函数,用嵌套循环即可清晰控制每一维的内存分配与数据搬运。
性能对比与使用建议
相比 Arrays.deepCopy(仅支持 Object[] 且内部仍用反射+循环)、手动双层 for 循环,arraycopy 方案优势明显:
- 底层调用 native 方法,复制速度接近内存 memcpy
- 避免自动装箱/拆箱(适用于基本类型数组)
- 内存局部性好,CPU 缓存友好
注意点:源和目标子数组必须类型一致、长度匹配;null 子数组需单独判空处理,否则 arraycopy 抛 NullPointerException。


















