基本类型数组拷贝即隔离,推荐Arrays.copyOf;对象数组需手动深拷贝元素;二维数组需外层与内层均拷贝。

基本类型数组:拷贝即隔离,无需额外操作
int[]、double[]、boolean[] 这类数组元素是值类型,拷贝时 JVM 直接复制每个数值。只要用 Arrays.copyOf()、System.arraycopy() 或 clone(),新数组就拥有完全独立的数据副本。改新数组任意元素,原数组丝毫不受影响。
推荐优先使用 Arrays.copyOf(src, src.length) ——简洁、语义清晰、自动分配内存,适合绝大多数场景。
一维对象数组:浅拷贝是默认行为,必须手动深拷贝元素
Person[]、StringBuffer[] 等引用类型数组,标准拷贝方式(包括 Arrays.copyOf 和 clone)只复制每个元素的引用地址,不是对象本身。结果是两个数组指向同一组对象实例,修改任一对象的字段,两边都可见。
要真正隔离,需遍历并为每个元素创建新实例:
立即学习“Java免费学习笔记(深入)”;
- 若对象有拷贝构造器:new Person(src[i].getName(), src[i].getAge())
- 若正确实现了 Cloneable 并重写了 clone():src[i].clone()
- 避免依赖序列化做深拷贝——性能低、要求所有字段可序列化、不支持 transient 或资源型字段
二维及多维数组:分层处理,外层数组 + 内层数组都要拷贝
int[][] 是“数组的数组”,外层数组是引用类型,内层数组也是对象。只调用 Arrays.copyOf 外层数组,得到的是新引用数组,但每个 inner 数组仍与原数组共享。
正确做法是两步走:
- 先拷贝外层数组:Person[][] copy = Arrays.copyOf(original, original.length)
- 再逐个拷贝每个内层数组:for (int i = 0; i
若内层数组元素仍是对象(如 Person[][]),那每行内部还需按上一节方式深拷贝 Person 实例。
clone() 方法的陷阱与替代建议
数组自带 clone(),对基本类型安全;但对对象数组,它只是浅拷贝,容易误以为“已隔离”。更麻烦的是,Object.clone() 是 protected 的,且 Cloneable 接口无方法约束,实现易出错(比如漏克隆字段、final 字段无法赋值、继承链断裂)。
更可靠的做法是:
- 提供显式拷贝构造器:public MyClass(MyClass other) { ... }
- 提供静态工厂方法:public static MyClass deepCopy(MyClass src) { ... }
- 用组合逻辑封装拷贝过程,比依赖 clone() 更清晰、更可控、更易测试


















