我们在日常编码中,肯定会遇到对象拷贝的问题,比如接口的入参RequestDTO,我们在接收到入参DTO后,进行逻辑处理这时就需要把入参DTO拷贝给业务处理DTO,但是拷贝后,对两个DTO的修改是否会对彼此产生影响,我们来带着这个疑问先了解下深浅拷贝的原理,在说说实战中是怎么拷贝的。
浅拷贝:
我们都知道 JAVA 数据类型分为基本数据类型和引用数据类型,对于浅拷贝来说,它会创建一个新的对象,如果对象中的属性是基本数据类型则拷贝值,如果是引用数据类型则拷贝内存地址,也就意味着任何一个对象改变都会对其他产生影响。
浅拷贝图:
浅拷贝的实现:
1.实现Cloneable接口,重写clone方法
@Overridepublic Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}2.BeanUtils.copyProperties(a,b)BeanUtils.copyProperties(原对象,拷贝对象);
浅拷贝的弊端就是当你只想修改某一个拷贝对象的引用数据类型属性,原对象和其他拷贝对象受到影响。
深拷贝:
深拷贝与浅拷贝的不同之处在于,无论是基本数据类型对象还是引用数据类型对象都是独立的,相当于重新创建了一份对象,成为两个独立的个体。
深拷贝图:
深拷贝的实现:
- 对象的多层引用对象都需要实现Cloneable接口,重写clone方法.@Overridepublic Object clone() {
//深拷贝 try {
// 直接调用父类的clone()方法 student student = (Student) super.clone();
student.引用对象 = (引用对象) 引用对象.clone();
return student;
} catch (CloneNotSupportedException e) {
return null;
}
} - 对象 序列化 后,再反序列化后生成的对象.//将对象写入流中ByteArray outputStream outputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(拷贝对象);
//从流中取出ByteArray inputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
return (拷贝对象)objectInputStream.readObject(); - json 方式
String json =JSON.toJSONString(src);
T object = JSON.parseObject(json, clazz);
更多请关注公众号:别明天就今天吧