十、深拷贝和浅拷贝的区别是什么?

127 阅读2分钟

所谓拷贝,就是赋值。把一个变量赋给另外一个变量,把变量的内容进行拷贝。把一个对象的值赋给另外一个对象,就是把一个对象拷贝一份

浅拷贝: 是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 。

浅拷贝的实现方式:

  • Object类提供的clone方法可以实现对象的浅拷贝(需要实现Cloneable接口)

注: Cloneable是一个空接口,对Cloneable接口可以把它理解为一个标记,是开发者允许这个类对象可以被拷贝的标记。

深拷贝: 是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象。

深拷贝的实现方式:

  • 构造函数实现

  • 通过重写clone方法来实现深拷贝(实现Cloneable接口)

  • 通过对象序列化实现深拷贝(实现Serializable接口)

序列化拷贝是把对象转换为字节序列,再把字节序列恢复成对象,不是属性的拷贝,所以使用序列化拷贝可以不实现Cloneable接口,但要实现Serializable接口

代码实现

区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝改变新对象不会影响原对象,他们之前互不影响。

安全性: 深拷贝是安全的,因为浅拷贝的话如果有引用类型,那么拷贝后对象,引用类型变量修改,会影响原对象