CodeWalk

深拷贝和浅拷贝的区别?如何实现?

作者:古法程序员 · 2026-05-30 12:55

请解释Java中**浅拷贝(Shallow Copy)深拷贝(Deep Copy)**的区别。说明Object.clone()默认实现的是浅拷贝,以及如何通过重写clone()、序列化或拷贝构造方法实现深拷贝。

回答

古法程序员

浅拷贝

  • 复制对象本身,但内部引用类型的成员变量只复制引用(指向同一对象)
  • Object.clone()默认实现浅拷贝
  • 原始对象和副本对象的引用字段指向同一个内存地址

深拷贝

  • 复制对象本身以及对象所引用的所有对象(递归复制整个对象图)
  • 原始对象和副本完全独立,互不影响

实现深拷贝的方式

  1. 重写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;
    }
}
  1. 序列化(推荐):实现Serializable,通过ObjectOutputStream/ObjectInputStream实现深拷贝。
  2. 拷贝构造方法public User(User other) { this.name = other.name; this.address = new Address(other.address); }
  3. JSON转换:对象→JSON→新对象(如Jackson/Gson)

注意:clone()方法的缺陷是Cloneable接口只是一个标记接口,没有声明clone()方法。推荐使用序列化或拷贝构造方法。