浅拷贝
浅拷贝仅仅复制拷贝的对象,而不复制它所引用的对象。
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。被复制的对象的对象属性,被它和它的副本之间共享。
public Object clone() throws CloneNotSupportedException {
// 浅复制时:
// Object object = super.clone();
// return object;
// 改为深复制:
Student student = (Student) super.clone();
// 本来是浅复制,现在将Teacher对象复制一份并重新set进来
student.setTeacher((Teacher) student.getTeacher().clone());
return student;
}
深拷贝
是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存
。
当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
深拷贝 : 对原对象的所有对象属性进行浅拷贝;
利用序列化和反序列化的方式进行深拷贝.
/**
* 对象的深度克隆,此处的对象涉及Collection接口和Map接口下对象的深度克隆
* 利用序列化和反序列化的方式进行深度克隆对象
*
* @param <T> 待克隆对象的数据类型
* @param object 待克隆的对象
* @return 已经深度克隆过的对象
*/
public static <T extends Serializable> T deepCloneObject(Particle object) {
T deepClone = null;
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ObjectInputStream ois = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
bais = new ByteArrayInputStream(baos
.toByteArray());
ois = new ObjectInputStream(bais);
deepClone = (T)ois.readObject();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if(baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(oos != null) {
oos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try{
if(bais != null) {
bais.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try{
if(ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return deepClone;
}