深拷贝和浅拷贝是关于对象复制的两个概念。它们描述了在复制对象时,复制的是对象本身还是对象的引用。
- 浅拷贝是指在复制对象时,仅复制对象本身,而不复制对象引用的内容。也就是说,新对象和原对象共享相同的引用,修改其中一个对象的内容会影响到另一个对象。
- 深拷贝是指在复制对象时,不仅复制对象本身,还复制对象引用的内容。也就是说,新对象和原对象拥有各自独立的引用和内容,修改一个对象的内容不会影响到另一个对象。
下面通过一个示例来说明浅拷贝和深拷贝的区别:
import java.util.ArrayList;
import java.util.List;
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Main {
public static void main(String[] args) {
List<Person> originalList = new ArrayList<>();
originalList.add(new Person("Alice"));
originalList.add(new Person("Bob"));
// 浅拷贝
List<Person> shallowCopyList = new ArrayList<>(originalList);
// 深拷贝
List<Person> deepCopyList = new ArrayList<>();
for (Person person : originalList) {
deepCopyList.add(new Person(person.getName()));
}
// 修改原始对象的内容
originalList.get(0).setName("Charlie");
// 输出结果
System.out.println("Original List: " + originalList.get(0).getName() + ", " + originalList.get(1).getName());
System.out.println("Shallow Copy List: " + shallowCopyList.get(0).getName() + ", " + shallowCopyList.get(1).getName());
System.out.println("Deep Copy List: " + deepCopyList.get(0).getName() + ", " + deepCopyList.get(1).getName());
}
}
在这个示例中,我们创建了一个 Person 类,其中包含一个 name 属性。然后,我们创建了一个原始的 Person 对象列表 originalList,并将其复制到两个新的列表 shallowCopyList(浅拷贝)和 deepCopyList(深拷贝)中。
接下来,我们修改原始列表中的第一个 Person 对象的 name 属性为 “Charlie”。然后,我们分别输出三个列表中第一个 Person 对象的 name 属性。
输出结果如下:
Original List: Charlie, Bob
Shallow Copy List: Charlie, Bob
Deep Copy List: Alice, Bob
可以看到,浅拷贝的列表和原始列表共享相同的对象引用,因此修改一个对象的内容会影响到另一个对象。而深拷贝的列表则是完全独立的,修改一个对象的内容不会影响到其他对象。
在实际开发中,选择浅拷贝还是深拷贝取决于具体的需求。如果你需要复制的对象是不可变的,或者你希望复制的对象和原始对象共享相同的引用,那么浅拷贝可能是一个更好的选择。如果你希望复制的对象是独立的,修改一个对象的内容不会影响到其他对象,那么深拷贝可能更适合。
深拷贝与浅拷贝适用于任何对象或数据类型,深拷贝常用于对象、List、Map等。