当我们在 Java 中需要克隆一个对象时,有两种选择:
- 浅克隆 Shallow Copy
- 深克隆 Deep Copy
对于浅克隆,我们只复制字段值(filed values), 因此克隆可能依赖于原始对象。
在深克隆中,我们确保对象中的所有内容都被深层复制,因此副本不依赖于任何可能改变的引用。
对象的 hashCode
相同, equals
相等,但是不是同一个对象。符合克隆的定义:内容相同,但是不是同一个个体。
但是浅克隆有一个问题,当原始对象改变时,副本也会发生变化, 在代码中通常表现为被意外修改了。
基于浅克隆上述的问题,所以深克隆采用了手段以达到所有内容都被深层复制的目的。
在 Java 中,深克隆有以下几个实现途径:
- 构造函数复制
- 实现基于 Object 的
clone
方法 - 采用外部库,将对象序列化,然后将其反序列化为一个新对象
具体请看代码实现。