如何实现对象克隆
实现克隆的两种方式
-
实现Cloneable接口并重写Object类中的clone()方法
-
实现Serializable接口,通过对象的序列化和反序列化实现克隆。可以实现真正的深度克隆
浅克隆(Shallow Cloning)和深克隆(Deep Cloning)的区别
-
浅克隆
-
浅克隆在复制对象时,创建一个新对象,它的字段值与原始对象相同。如果字段是基本数据类型,则会复制它们的值;如果字段是对象的引用,则复制的是引用,而不是引用的对象本身。
-
原始对象和克隆对象共享相同的引用对象。对克隆对象中引用对象的修改会影响到原始对象中的相应对象。反之,亦然。
-
浅克隆通常通过复制原始对象的字段值来实现,可以通过实现Cloneable接口并重写Object类中的clone()方法来实现。
-
-
深克隆
-
深克隆在复制对象时,不仅复制对象本身,还递归地复制所有引用类型的成员变量。
-
原始对象和克隆对象之间不会有任何共享的内部对象。
-
深克隆通常更复杂,可以通过递归调用 clone() 方法、使用序列化/反序列化或复制构造函数来实现。
-
区别:
-
成员变量的引用处理:
- 浅克隆只复制对象的引用,而不复制引用的对象。
- 深克隆复制对象及其所有引用的对象。
-
内存占用:
- 浅克隆通常使用较少的内存,因为它共享内部对象。
- 深克隆使用更多的内存,因为它复制了所有的内部对象。
-
数据安全性
-
浅克隆由于克隆对象和原始对象共享引用对象的内存,对克隆对象中引用对象的修改会直接影响到原始对象中的相应对象。这可能导致原始数据被意外修改或泄露。
-
深克隆通过递归地复制对象的所有引用成员,创建克隆对象的独立副本,从而确保克隆对象与原始对象在内存中的完全独立性。这意味着对克隆对象中任何数据的修改都不会影响到原始对象。
-
-
适用场景:
- 浅克隆适用于内部对象不需要独立修改的场景。
- 深克隆适用于需要完全独立的克隆对象,包括其内部对象的场景。
注:代码示例请查看参考链接