前言
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制时常见的两个概念,它们的主要区别在于是否复制了对象中的“引用对象”。
浅拷贝(Shallow Copy)
浅拷贝会创建一个新对象,但只复制原始对象中的“值类型”字段或引用地址,不会复制引用对象本身。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Person { String name; }
class Student { int id; Person person; }
Student s1 = new Student(); s1.id = 1; s1.person = new Person(); s1.person.name = "Alice";
Student s2 = s1;
s2.person.name = "Bob";
System.out.println(s1.person.name);
|
深拷贝(Deep Copy)
深拷贝会创建一个全新的对象,并且递归复制所有引用类型字段所引用的对象。这样,拷贝出的对象和原对象完全独立,互不影响。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Person implements Cloneable { String name;
public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } }
class Student implements Cloneable { int id; Person person;
public Student clone() throws CloneNotSupportedException { Student cloned = (Student) super.clone(); cloned.person = person.clone(); return cloned; } }
|
使用示例:
1 2 3 4 5 6 7 8 9
| Student s1 = new Student(); s1.id = 1; s1.person = new Person(); s1.person.name = "Alice";
Student s2 = s1.clone(); s2.person.name = "Bob";
System.out.println(s1.person.name);
|
后记
特性 |
浅拷贝 |
深拷贝 |
拷贝对象 |
创建新对象 |
创建新对象 |
值类型字段 |
拷贝 |
拷贝 |
引用类型字段 |
仅复制引用地址 |
复制引用指向的对象 |
是否互相影响 |
是 |
否 |
适合场景 |
对象内部数据结构简单时 |
对象包含嵌套引用对象时 |