1. 理解对象的深拷贝和浅拷贝
-
浅拷贝
浅拷贝对于基本数据类型和Stirng类型来说拷贝的是值,对于引用类型来说
直接拷贝对象的引用
。因此修改了原对象的引用类型会影响到拷贝对象的引用类型。
-
深拷贝
深拷贝对于基本数据类型和Stirng类型来说拷贝的是值,对于引用数据类型来说会
创建一个新的对象,再将引用指向该对象
,因此对原来的对象进行修改不会影响到拷贝的对象。
2. 如何实现深拷贝?
- 1.手动实现Cloneable接口,实现clone方法逻辑(工程量大)
class Employee implements Cloneable,Serializable{
private String name;
private int age;
private Address address;
// 省略构造器,get,set,toString方法
@Override // 逐个对象进行拷贝再赋值
protected Employee clone() throws CloneNotSupportedException {
Employee employee = (Employee) super.clone();
employee.setAddress( address.clone() );
return employee;
}
}
class Address implements Cloneable,Serializable{
private String country;
private String city;
// 省略构造器,get,set,toString方法
@Override
protected Address clone() throws CloneNotSupportedException {
return (Address)super.clone();
}
}
- 2.使用序列化和反序列化实现深拷贝(必须实现Serializable接口)
序列化产生的是两个完全独立的对象,无论嵌套多少个引用类型序列化都能实现深拷贝
public Employee deepCopy() throws IOException, ClassNotFoundException {
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois =new ObjectInputStream(bis);
return (Employee) ois.readObject();
}
3. 总结对象的深拷贝和浅拷贝的区别
深拷贝 | 浅拷贝 |
---|---|
基本数据类型和String拷贝的是值,修改属性不会相互影响 | 基本数据类型和String拷贝的是值,修改属性不会相互影响 |
对象中引用数据类型属性拷贝的是一个全新的对象,原对象中修改引用对象属性对拷贝对象无影响 | 对象中引用数据类型属性拷贝的是引用,原对象中修改了引用对象会影响到拷贝对象 |