java深拷贝核心是切断所有可变引用共享链,推荐拷贝构造器;若用clone()需实现cloneable、重写public clone()并逐字段深克隆;序列化方式要求全部类型serializable,适合结构稳定场景。

Java 对象实现深拷贝,核心是**切断所有可变引用的共享链**,让副本与原对象在内存中完全独立。浅拷贝只复制字段值(对引用类型仅复制地址),一旦某个引用指向的对象被修改,两个对象都会受影响——这就是“引用污染”。要真正避免,必须逐层创建新对象。
用拷贝构造器最稳妥
这是推荐首选方式,逻辑清晰、支持 final 字段、不绕过构造逻辑,也便于单元测试:
- 为类添加形如 public Person(Person src) 的构造器
- 基本类型和不可变对象(String、Integer、LocalDateTime)直接赋值
- 可变引用字段(如 Address、List
)调用其自身的拷贝构造器或 deepCopy() 方法 - 集合类不能写 new ArrayList(srcList) 就完事——如果元素是可变对象(比如 Order),需遍历并克隆每个元素:srcList.stream().map(Order::new).collect(Collectors.toList())
手动重写 clone() 需满足三个硬性前提
若坚持用 clone(),以下三点缺一不可,否则连浅拷贝都会失败:
- 类声明 implements Cloneable(纯标记接口)
- clone() 方法改为 public,且第一行必须是 super.clone()
- 所有被引用的可变类型(如 Address、ArrayList)也得各自实现 Cloneable 并提供 public clone()
之后在 clone() 方法体内,对每个可变字段单独处理:ArrayList 要新建并填充;自定义对象要调 .clone();数组要用 Arrays.stream(...).map(...).toArray(),不能只用 array.clone()(那是浅的)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
序列化方式适合结构稳定对象
把对象转成字节流再反序列化,天然生成全新对象图,能自动处理多层嵌套和循环引用(部分实现支持):
- 要求目标类及**所有嵌套字段类型都实现 Serializable**
- transient 字段、外部资源(如 FileInputStream)、Lambda 表达式无法序列化,会失败
- 性能有开销,不适合高频调用场景;但作为工具方法封装后,一行代码即可调用
哪些字段不用深拷贝,哪些必须处理
关键看是否「可变」:
- 无需深拷贝:基本类型(int、boolean)、不可变类(String、Integer、BigDecimal、LocalDateTime)——它们的“修改”本质是新建对象,不影响原引用
- 必须深拷贝:自定义 POJO(Address)、集合(ArrayList、HashMap)、数组(尤其是对象数组)、Date、StringBuilder、任何含 public setter 或可变状态的类
漏掉任何一个可变引用,就可能造成部分共享、部分独立的“半深拷贝”,问题更隐蔽。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










