在Java中,深拷贝和浅拷贝是用来描述对象复制的两种方式,它们在复制对象时处理引用类型属性的方式不同。
-
浅拷贝(Shallow Copy):
- 浅拷贝只复制对象的基本数据类型字段和引用字段的引用,而不复制引用对象所指向的数据。当你对一个对象做浅拷贝时,新的对象和原始对象会引用同一块内存地址中的子对象。也就是说,对新的对象中引用子对象的修改,也会影响到原始对象的子对象。
- 在Java中,使用
Object
类的clone()
方法可以实现浅拷贝,前提是类实现了Cloneable
接口。 - 示例代码:
class Address {
String city;
public Address(String city) {
this.city = city;
}
}
class Person implements Cloneable {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Address address = new Address("New York");
Person person1 = new Person("John", address);
Person person2 = (Person) person1.clone();
// 修改person2的地址
person2.address.city = "Los Angeles";
// person1的地址也会受到影响
System.out.println(person1.address.city); // 输出: Los Angeles
}
}
2.深拷贝(Deep Copy):
- 深拷贝不仅复制对象的基本数据类型字段,还会创建新的实例并递归复制所有引用类型字段。这样,新的对象和原始对象就完全独立,修改一个对象不会影响另一个对象。
- 实现深拷贝通常需要手动编写代码来复制引用对象的内容,或者使用序列化和反序列化的方式来实现。
- 示例代码:
class Address {
String city;
public Address(String city) {
this.city = city;
}
public Address(Address address) {
this.city = address.city;
}
}
class Person {
String name;
Address address;
public Person(String name, Address address) {
this.name = name;
this.address = new Address(address);
}
public Person deepCopy() {
return new Person(this.name, this.address);
}
}
public class Main {
public static void main(String[] args) {
Address address = new Address("New York");
Person person1 = new Person("John", address);
Person person2 = person1.deepCopy();
// 修改person2的地址
person2.address.city = "Los Angeles";
// person1的地址不受影响
System.out.println(person1.address.city); // 输出: New York
}
}
总结来说,浅拷贝只复制对象的引用,而深拷贝则是创建新对象并递归复制所有字段。选择使用哪种拷贝方式应根据实际需求来决定。