system.arraycopy不能直接深拷贝多维数组,需分层手动处理:先分配外层新容器,再逐行用arraycopy搬运一维基本类型段;对可变对象数组还需额外克隆实例。

System.arraycopy 不能直接深拷贝多维数组,它只处理一维内存块。要高效复制 int[][]、String[][] 等结构,必须手动分层控制:先分配新容器,再逐行(或逐层)用 arraycopy 搬运数据。核心不是“让它变深”,而是理解“数组的数组”本质,再用它最擅长的方式——快速搬运基本类型一维段。
二维数组深拷贝:两步缺一不可
对 int[][] 这类二维数组,一次 System.arraycopy 只复制外层数组中“指向子数组的引用”,结果是浅拷贝,新旧数组共享子数组内存。真正独立拷贝需明确两步:
- 分配外层新容器:int[][] dest = new int[src.length][];(注意:不是 new int[src.length][src[0].length],否则无法适配不规则行)
- 逐行初始化并搬运:for (int i = 0; i
- 若某行可能为 null,循环内需加判空,避免调用 arraycopy 时抛 NullPointerException
三维及以上:递进式展开,不用递归
int[][][] 是“二维数组的数组”,复制逻辑自然延展,无需写递归函数:
- 先建最外层:int[][][] dest = new int[src.length][][];
- 再对每个 src[i](即一个 int[][])执行完整的二维深拷贝流程:new int[src[i].length][] → 循环每行 → new + arraycopy
- arraycopy 始终只作用于最内层的一维基本类型数组(如 int[]),中间维度靠循环和 new 显式管理内存
对象数组要注意:引用拷贝 ≠ 对象安全
String[][] 用上述方法复制后是安全的,因为 String 不可变;但 ArrayList
- System.arraycopy 仍只复制外层数组引用和子数组引用,不会克隆 ArrayList 实例本身
- 修改 dest[i].add("x"),src[i] 同样可见该元素——它们指向同一个对象
- 如需完全隔离,必须在逐行复制后,对每个可变对象单独处理:调用 clone()、用构造器重建,或走序列化反序列化路径
性能关键:别让 arraycopy 白跑一趟
它快的前提是条件匹配,否则比 for 循环还慢:
- 基本类型数组拷贝长度建议 ≥ 256,JVM 才大概率启用 SIMD 指令;≤ 16 时 JNI 开销反而占优
- 目标数组必须提前分配好,且长度足够;用 Arrays.copyOf 会多一次堆分配,clone() 无法指定范围
- 避免在高频循环里反复调用;参数尽量用编译期可确定的常量,利于 JIT 内联优化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











