如何实现深拷贝和浅拷贝
时间: 2023-11-02 21:06:44 浏览: 78
深拷贝和浅拷贝是针对对象(包括数组)的复制操作,它们的区别在于复制出来的新对象与原对象之间的关系不同。
浅拷贝只复制对象本身,而不会复制对象内部的子对象,新对象和原对象之间共享子对象。例如,对于一个包含引用类型成员变量的对象,浅拷贝会复制成员变量的引用,而不会复制成员变量所指向的对象。浅拷贝可以通过对象的 clone() 方法实现。
深拷贝则会复制整个对象及其内部所有子对象,新对象和原对象之间完全独立。例如,对于一个包含引用类型成员变量的对象,深拷贝会递归复制成员变量所指向的对象。深拷贝可以通过序列化和反序列化实现,或者手动递归复制对象及其子对象。
以下是 Java 中的示例代码:
浅拷贝:
```java
public class Person implements Cloneable {
public String name;
public Address address;
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
public class Address {
public String city;
}
Person p1 = new Person();
p1.name = "Alice";
p1.address = new Address();
p1.address.city = "Shanghai";
Person p2 = p1.clone();
p2.name = "Bob";
p2.address.city = "Beijing"; // 修改 p2 的 address
System.out.println(p1.name); // "Alice"
System.out.println(p1.address.city); // "Beijing",p1 和 p2 的 address 引用同一个对象
```
深拷贝:
```java
public class Person implements Serializable {
public String name;
public Address address;
public Person deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (Person) ois.readObject();
}
}
public class Address implements Serializable {
public String city;
}
Person p1 = new Person();
p1.name = "Alice";
p1.address = new Address();
p1.address.city = "Shanghai";
Person p2 = p1.deepClone();
p2.name = "Bob";
p2.address.city = "Beijing"; // 修改 p2 的 address
System.out.println(p1.name); // "Alice"
System.out.println(p1.address.city); // "Shanghai",p1 和 p2 的 address 引用不同的对象
```
阅读全文