Java的深拷贝和浅拷贝

介绍

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

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

举例

浅拷贝

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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();
}
}

测试

1
2
3
4
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}
}

测试

1
2
3
4
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 深拷贝和浅拷贝区别


Java的深拷贝和浅拷贝
https://huajframe.github.io/2020/09/24/Java基础/Java的深拷贝和浅拷贝/
作者
HuaJFrame
发布于
2020年9月24日
许可协议