浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
// 深拷贝实现方式
构造方法:修改对象后需要修改构造方法,可用性差
重载clone():修改对象后需要修改clone方法,拷贝类需要实现Cloneable接口,可用性差
1.序列化:拷贝类需要实现Serializable接口
@Data
public class Person implements Serializable {
public String name;
public Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
}
@Data
class Address implements Serializable{
private String nation;
private String city;
public Address(String nation, String city) {
this.nation = nation;
this.city = city;
}
}
public static void main(String[] args) throws Exception {
Person person1 = new Person("小明", new Address("中国", "重庆"));
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(person1);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
Person person2 = (Person) ois.readObject();
// 使用序列化工具org.springframework.util.SerializationUtils
byte[] serialize = SerializationUtils.serialize(person1);
Person person2 = (Person) SerializationUtils.deserialize(serialize);
System.out.println(person2.getAddress().getCity());
person1.getAddress().setCity("上海");
System.out.println(person2.getAddress().getCity());
}
2.json
@Data
public class Person {
private String name;
private Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
}
@Data
public class Address {
private String nation;
private String city;
public Address(String nation, String city) {
this.nation = nation;
this.city = city;
}
}
public static void main(String[] args) throws Exception {
Person person1 = new Person("小明", new Address("中国", "重庆"));
String str = JSON.toJSONString(person1);
Person person2 = JSONObject.parseObject(str, Person.class);
System.out.println(person2.getAddress().getCity());
person1.getAddress().setCity("上海");
System.out.println(person2.getAddress().getCity());
}
// 3.手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制