浅拷贝
浅拷贝是指将一个对象复制到另一个变量中,但是复制的是对象的地址,而不是对对象本身进行复制。原始对象的引用和复制对象的引用时期上是共享同一个内存地址的。
所以我们修改了复制引用指向的对象中的属性或方法,原始引用指向的对象的属性或元素也会被修改。
Java中我们常使用的BeanUtils基本也都是浅拷贝。
适用场景:浅拷贝的好处就是性能比较好,他只需要做一个引用地址的复制就可以了。
当我们希望两个或者多个对象共享部分数据的时候就可以使用浅拷贝。
深拷贝
深拷贝是指将一个对象及其子对象都复制到另一个变量中,他会创建一个全新的对象,并且将原始对象中的所有属性或者方法都复制到新的对象中。
所以我们在修改复制对象中的元素时,原始对象中的元素不会改变。
适用场景:深拷贝的好处就是两个对象完全隔离的。当我们需要完全独立的对象副本时,就需要用到深拷贝。
实现浅拷贝
可以使用BeanUtils.copyProperties来进行浅拷贝。
实现深拷贝
实现Cloneable接口,重写clone()
在Object的类中定义了一个clone方法,这个方法在不重写的情况下时浅拷贝的。
如果想要实现深拷贝就需要重写clone方法,如果想要重写clone方法就必须实现Cloneable接口,否则就会报CloneNotSupportedException异常。
序列化实现深拷贝
先把对象进行序列化成流,再将流序列化成对象,这个对象就是独立于原来对象的新对象了。