java浅拷贝与深拷贝
java浅拷贝与深拷贝
当我们需要把DTO的属性复制到Entity时,会使用get、set方法对每个属性进行操作,如果属性有N多个,就会非常麻烦,这时我们可以使用java对象拷贝。
java对象拷贝分为浅拷贝和深拷贝
浅拷贝和深拷贝的主要区别在于是否支持引用类型的成员变量的复制
这时我们就要清楚Java中的数据类型分为基本数据类型和引用数据类型
浅拷贝:拷贝时创建一个新的对象,对象中的属性如果是基本数据类型会新创建的对象,但是属性是引用类型不会创建新的对象,而是使用与之前的对象指向同一个内存地址
深拷贝:拷贝时创建一个新的对象,并且所有属性都是新对象(指向新的内存地址)
我们使用代码来解释浅拷贝,使用Entity对象复制一个DTO
现在进行对象浅拷贝
打印结果,entity对象的值已经成功复制到dto中
现在我们来证实一下浅拷贝的特点(引用类型指向原对象的内存地址)
打印结果,发现entity和dto属性的helloDTO都修改了成777777了
可以得出浅拷贝entity和testDTO都是引用了同一个helloDTO对象
但我测试了基本数组和枚举并不是引用同一个对象。这里没有截图
结论:浅拷贝复制的引用类型(但不包括数组和枚举)与原对象指向同一个内存地址
下面我们验证一下深拷贝,这里使用IO流的方式进行深拷贝
打印结果
发现修改HelloDTO属性后,只有原来的entity对象的属性值修改了,拷贝出来的entity对象的属性值并没有变化。
可以得出深拷贝拷贝出来的是新的对象(内存地址)
总结:
浅拷贝和深拷贝都会把相同类型和名称的属性值复制到目标类中,区别在于
浅拷贝对于引用类型(但不包括数组和枚举)的属性只是引用原对象的内存地址(同一个对象),
深拷贝是所有属性都创建新的对象
另外注意上面用到的使用IO流进行深拷贝,只能是同一种类型才行。并不能实现entity类转dto类。所有这种方式并不实用。百度谷歌上搜索出来的答案的方式也都只能是同类型的转换,个人感觉并没有多大用处,如果需要不同类型的转换,可能要用上反射或者字节码的操作了。