深拷贝与浅拷贝
约 743 字大约 2 分钟
2025-09-04
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制中的两种核心方法,主要区别在于拷贝的深度以及对原始对象内部结构的影响。
浅拷贝
浅拷贝创建一个新对象,但仅复制原始对象的基本数据类型字段(如 int、char)和引用类型字段的地址(即指针),而不复制引用指向的实际对象。
- 核心特点:
- 新对象与原始对象共享引用类型字段指向的同一对象。
- 修改新对象的引用类型字段会影响原始对象,因为它们指向同一内存地址。
- 适用场景:适用于对象结构简单、引用类型字段不可变或无需独立修改的场景(如 Java 中的
Arrays.copyOf()方法)。 - 风险:共享引用可能导致意外的副作用,破坏数据一致性。
深拷贝
深拷贝创建一个新对象,并递归复制原始对象的所有字段及其引用的对象,生成一个完全独立的副本。
- 核心特点:
- 新对象与原始对象的所有字段(包括引用类型)均独立存储,不共享任何内存地址。
- 修改新对象不会影响原始对象,确保数据隔离。
- 适用场景:适用于对象结构复杂、引用类型字段需独立修改的场景(如 Java 中通过序列化或自定义递归复制实现)。
- 实现方式:通常通过递归遍历对象图(Object Graph),为每个嵌套对象创建新实例。
示例说明
以 Java 中的 User 和 Address 类为例,演示浅拷贝与深拷贝的区别:
class User {
private String name; // 基本数据类型字段
private String password; // 基本数据类型字段
private Address address; // 引用类型字段
}
public class Address {
private String province; // 基本数据类型字段
private String city; // 基本数据类型字段
private String area; // 基本数据类型字段
}- 浅拷贝场景:
- 拷贝
User对象user1到user2时,user2是一个新对象(地址不同),但user2.address与user1.address共享同一Address实例。 - 修改
user2.address.city会导致user1.address.city同步变化。
- 拷贝
- 深拷贝场景:
- 拷贝
User对象user1到user2时,user2.address是一个全新的Address对象(地址不同)。 - 修改
user2.address.city不会影响user1.address.city。
- 拷贝
关键区别总结
| 特性 | 浅拷贝 | 深拷贝 |
|---|---|---|
| 拷贝深度 | 仅复制基本类型和引用地址 | 递归复制所有字段及引用对象 |
| 内存共享 | 引用类型字段共享对象 | 所有字段独立存储 |
| 影响范围 | 修改副本可能影响原始对象 | 修改副本不影响原始对象 |
| 性能开销 | 较低(仅需复制引用) | 较高(需递归复制整个对象图) |
| 典型实现 | Java 的 Object.clone()(默认) | Java 的序列化或自定义递归复制逻辑 |