首页 > 试题广场 >

对象的浅拷贝和深拷贝区别是什么?在JAVA中如何实现?

[问答题]
对象的浅拷贝和深拷贝区别是什么?在JAVA中如何实现?
对于浅拷贝复制的对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。而深拷贝复制的对象无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。实现 Cloneable 并重写 clone() 方法。
发表于 2020-08-03 11:17:51 回复(0)
浅拷贝:“被复制对像”基本类型的值和对象的引用。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:“被复制对象”基本类型的值,对象的引用将重新指向一个被复制过的新对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

浅拷贝使用clone()和Cloneable即可实现。
深拷贝使用流将“被复制对象”序列化到内存再读取的方式来实现。

发表于 2020-03-12 18:57:19 回复(0)
1.浅拷贝
(1)把一个对象的所有属性拷贝到具有相同类类型的对象中。如果是基本数据类型和String类型的对象,浅拷贝实现了值传递;如果是引用数据类型的对象,浅拷贝实际上是进行了引用传递,将一个变量的内存地址复制给了新对象。
(2)在Java中,浅拷贝主要有两种实现方式:
①通过构造方法实现;②通过clone()方法实现,且clone()方法所在的类需要实现Cloneable接口;
2.深拷贝
(1)相对于浅拷贝,深拷贝不仅需要拷贝虽有基本数据类型和String类型对象的值,还要给引用数据类型对象申请存储空间,而不是进行简单的地址传递。
(2)在Java中,深拷贝有两种实现方式
①让原型类和原型类中引用数据类型对象的类,都实现Cloneable和Serializable接口,并在原型类中重写clone()方法;但这种方式只能对引用数据类型对象一个个处理,比较麻烦;
②使用对象序列化的方式。通过字节数组输出流、对象输出流将对象序列化,再通过字节数组输入流、对象输入流进行反序列化,从而实现深拷贝
发表于 2020-07-22 21:12:17 回复(0)

浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())

深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)


发表于 2020-01-11 17:36:21 回复(0)
赋值、深拷贝、浅拷贝:
赋值:不是严格意义上的拷贝,拷贝的的仅仅是引用关系,并没有生成新的实际对象。
深拷贝:拷贝对象和原始对象的引用数据类型引用不同对象。
浅拷贝:值类型的字段会复制一份,引用类型的字段拷贝的仅仅是引用地址,而该引用地址指向的实际对象空间只有一份。
发表于 2020-10-08 14:43:47 回复(0)
浅拷贝: 原有对象中的基本变量复制值,引用类型复制地址链接
深拷贝: 新建一个内存空间存储复制过来的变量
发表于 2020-09-10 15:14:24 回复(0)
浅拷贝是对值的简单复制,是指向对象的引用的时候会把对象地址直接给新的引用,指向同一个堆内存。浅拷贝不能真正达到拷贝的目的。
深拷贝会对引用进行内容上的复制,在内存中新建一个属性相同的对象。
在java中使用clone()实现
发表于 2020-08-10 14:06:52 回复(0)
浅拷贝:“拷贝的对象”拷贝的是原的对象的基本类型成员变量的值和引用类型成员变量的引用的的复制,也就是说拷贝对象和原对象的引用类型的成员变量指向的是同一个地址,只要我们修改其中一个对象的引用类型成员变量另一个对象的对应值也会修改。一般是使用实现cloneable接口,重写clone方法实现浅拷贝。
深拷贝:“拷贝的对象”拷贝的是原对象基本类型成员变量的值和引用类型成员变量所指向地址的复制,也就是会新开辟一块内存空间存储原对象的引用类型对象所指向的地址内容。一般是对象实现Serializable接口,通过序列化和反序列化的方式创建拷贝对象
发表于 2020-08-07 23:32:53 回复(0)