抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

深拷贝(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); // 输出:Bob

深拷贝(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(); // 关键:深拷贝 person
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); // 输出:Alice(不会被影响)

后记

特性 浅拷贝 深拷贝
拷贝对象 创建新对象 创建新对象
值类型字段 拷贝 拷贝
引用类型字段 仅复制引用地址 复制引用指向的对象
是否互相影响
适合场景 对象内部数据结构简单时 对象包含嵌套引用对象时

评论