深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是在对象克隆或复制过程中常用的两种方式,它们有以下区别:
-
浅拷贝:浅拷贝创建一个新对象,该对象与原始对象共享相同的内存地址,其中的引用类型属性仍然指向原始对象中的相同对象。换句话说,浅拷贝只复制对象的引用,而不复制对象本身。
-
深拷贝:深拷贝创建一个新对象,该对象与原始对象完全独立,即使是引用类型属性也会被复制并创建新的对象。深拷贝会递归复制对象及其所有引用类型属性,确保新对象与原始对象没有任何关联。
下面是一个示例来说明深拷贝和浅拷贝的区别:
class Person {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
// Getters and setters
}
class Address {
private String city;
public Address(String city) {
this.city = city;
}
// Getters and setters
}
// 浅拷贝示例
Address address = new Address("Beijing");
Person person1 = new Person("Alice", address);
Person person2 = person1; // 浅拷贝
person2.setName("Bob");
person2.getAddress().setCity("Shanghai");
System.out.println(person1.getName()); // 输出 "Bob",原始对象也被修改
System.out.println(person1.getAddress().getCity()); // 输出 "Shanghai",原始对象也被修改
// 深拷贝示例
Address address = new Address("Beijing");
Person person1 = new Person("Alice", address);
Person person2 = new Person(person1.getName(), new Address(person1.getAddress().getCity()));
person2.setName("Bob");
person2.getAddress().setCity("Shanghai");
System.out.println(person1.getName()); // 输出 "Alice",原始对象不受影响
System.out.println(person1.getAddress().getCity()); // 输出 "Beijing",原始对象不受影响
在浅拷贝示例中,person1
和person2
共享相同的Address
对象,因此对person2
的修改也会影响到person1
。而在深拷贝示例中,通过创建新的Address
对象来确保person1
和person2
的Address
属性完全独立,对其中一个对象的修改不会影响到另一个对象。