数组克隆是浅拷贝但更“干净”,因jvm直接内存复制、不触发构造逻辑;对象clone需实现cloneable并重写方法,且默认也是浅拷贝;数组clone更轻量可靠,而深拷贝需手动或序列化实现。

数组克隆是浅拷贝,但行为更“干净”
Java 中对数组调用 clone(),本质是 JVM 层面的内存块复制:分配新数组、逐字节拷贝内容、保留类型信息。它不走构造逻辑,不触发初始化块,也不调用任何 <init></init> 方法。对基本类型数组(如 int[]),每个元素值完全独立;对引用类型数组(如 String[] 或 MyObj[]),只复制引用地址——新旧数组各自持有独立的数组对象,但其中的元素仍指向同一堆对象。
对象 clone() 需显式支持,且默认也是浅拷贝
普通 Java 对象要使用 clone(),必须:
- 实现 Cloneable 接口(否则抛 CloneNotSupportedException)
- 重写 clone() 方法并调用 super.clone()
- 若含可变引用字段(如 ArrayList<user></user>),需手动深拷贝这些字段,否则修改副本中的集合内容,原对象也会感知变化
数组克隆比对象 clone() 更轻量、更可靠
数组天生实现 Cloneable,无需额外声明;clone() 调用直接由 JVM 优化执行,性能接近 System.arraycopy(),线程安全,且不会因忘记调用 super.clone() 或漏写 throws 而编译失败。而自定义对象的 clone() 容易遗漏字段处理、异常声明或类型转换,维护成本高。
替代方案选择要看场景需求
若只需第一层隔离:
- 数组优先用 clone() 或 Arrays.copyOf()
- 对象可用 Object.assign()(JS)、new Obj(o)(带拷贝构造)、或 BeanUtils.copyProperties()(Spring)
若需彻底隔离嵌套结构:
- JS 环境常用 JSON.parse(JSON.stringify())(忽略函数、undefined、Date 等)或递归深克隆函数
- Java 环境推荐序列化/反序列化、第三方库(如 Apache Commons Lang 的 SerializationUtils.clone())或手动编写深拷贝逻辑











