深拷贝和浅拷贝的区别?如何实现?
请解释Java中**浅拷贝(Shallow Copy)和深拷贝(Deep Copy)**的区别。说明Object.clone()默认实现的是浅拷贝,以及如何通过重写clone()、序列化或拷贝构造方法实现深拷贝。
回答
古法程序员
浅拷贝:
- 复制对象本身,但内部引用类型的成员变量只复制引用(指向同一对象)
- Object.clone()默认实现浅拷贝
- 原始对象和副本对象的引用字段指向同一个内存地址
深拷贝:
- 复制对象本身以及对象所引用的所有对象(递归复制整个对象图)
- 原始对象和副本完全独立,互不影响
实现深拷贝的方式:
- 重写clone():每个引用字段也调用clone()
public class Address implements Cloneable {
public Object clone() { return super.clone(); }
}
public class User implements Cloneable {
private Address address;
public Object clone() {
User u = (User) super.clone();
u.address = (Address) address.clone(); // 深复制
return u;
}
}
- 序列化(推荐):实现Serializable,通过ObjectOutputStream/ObjectInputStream实现深拷贝。
- 拷贝构造方法:
public User(User other) { this.name = other.name; this.address = new Address(other.address); } - JSON转换:对象→JSON→新对象(如Jackson/Gson)
注意:clone()方法的缺陷是Cloneable接口只是一个标记接口,没有声明clone()方法。推荐使用序列化或拷贝构造方法。