浅拷贝与深拷贝:
拷贝一个类,如果其中无其他引用类属性,浅拷贝可以直接完全拷贝这个对象,
但如果其中有其他引用类对象的话,浅拷贝不能拷贝其中的引用类。
即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。
浅拷贝:
为什么我们要用clone?
当我需要一个与变量A相同的值B,并且当我们修改B时,不影响A的值,clone是最简单的方法。
注意:使用clone拷贝类对象时,类对象需要实现cloneable接口,并且重写clone方法。
浅拷贝实现:直接clone对象或属性即浅拷贝。
深拷贝实现:
1.将引用也拷贝(clone)一份,实现是在实体类重写的clone方法中拷贝引用类。
即,假设A类中引用B类:
重写clone方法时:
A a = (A)super.clone();
a.setB((B) A.getB().clone());
2.序列化实现深拷贝,
实体类实现Serializable接口,并重写deepClone方法。
方法内容为:
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
3.用fastjson从Object转成json,然后转回object,本质上是反射:
private Object deepCopyByJson(Object obj) {
String json = JSON.toJSONString(obj);
return JSON.parseObject(json, Object.class);
}