深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是关于复制对象的概念。浅拷贝只复制对象的引用,而深拷贝会复制整个对象及其内部所有的引用对象。下面是Java代码示例来说明这两个概念:
import java.util.ArrayList;
import java.util.List;
class Person implements Cloneable {
private String name;
private List<String> hobbies;
public Person(String name, List<String> hobbies) {
this.name = name;
this.hobbies = hobbies;
}
public String getName() {
return name;
}
public List<String> getHobbies() {
return hobbies;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 浅拷贝
// return super.clone();
// 深拷贝
Person clonedPerson = (Person) super.clone();
clonedPerson.hobbies = new ArrayList<>(hobbies); // 创建新的爱好列表
return clonedPerson;
}
}
public class DeepCopyShallowCopyExample {
public static void main(String[] args) {
List<String> hobbies = new ArrayList<>();
hobbies.add("阅读");
hobbies.add("园艺");
Person originalPerson = new Person("Alice", hobbies);
try {
// 浅拷贝
Person shallowCopy = (Person) originalPerson.clone();
System.out.println("浅拷贝: " + (shallowCopy == originalPerson)); // false,对象引用不同
System.out.println("浅拷贝的爱好列表: " + (shallowCopy.getHobbies() == originalPerson.getHobbies())); // true,引用相同
// 深拷贝
Person deepCopy = (Person) originalPerson.clone();
System.out.println("深拷贝: " + (deepCopy == originalPerson)); // false,对象引用不同
System.out.println("深拷贝的爱好列表: " + (deepCopy.getHobbies() == originalPerson.getHobbies())); // false,引用不同
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
浅拷贝的爱好列表:
阅读
园艺
深拷贝的爱好列表:
阅读
园艺
注意,在浅拷贝中,爱好列表的引用是相同的,因此遍历结果相同。而在深拷贝中,我们创建了一个新的爱好列表,所以遍历结果也是相同的。这说明在深拷贝中,我们获得了一个独立的副本,不会受到原始对象的影响。
在浅拷贝中,如果你修改了原始对象中的引用类型属性(例如列表),新创建的对象也会受到影响,因为浅拷贝只是复制了引用,而不是实际的数据。