Java 的深拷贝和浅拷贝

78 阅读1分钟

介绍

深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。

举例

浅拷贝

我们实现Cloneable接口,重写clone()方法

public class Address implements Cloneable{
    private String addressName;

    public Address(String addressName) {
        this.addressName = addressName;
    }

    public String getAddressName() {
        return addressName;
    }

    public void setAddressName(String addressName) {
        this.addressName = addressName;
    }

    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address) super.clone();
    }
}

测试

Person person = new Person(new Address("长沙"));
Person person1 = person.clone();
System.out.println(person == person1);  //输出false
System.out.println(person.getAddress() == person1.getAddress()); //输出true

两个Address都指向同一块内存中的数据

深拷贝

修改浅拷贝的Person

public class Person implements Cloneable{
    private Address address;

    public Person(Address address){
        this.address = address;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person person = (Person) super.clone();
        person.setAddress(person.getAddress().clone());
        return person;
    }
}

测试

Person person = new Person(new Address("长沙"));
Person person1 = person.clone();
System.out.println(person == person1);  //输出false
System.out.println(person.getAddress() == person1.getAddress()); //输出false

person1的address也已经被clone

引用拷贝、浅拷贝、深拷贝三者区别

shallow&deep-copy.png

原文链接:Java Guide 深拷贝和浅拷贝区别