面试题答案
一键面试- 实现
Cloneable
接口并重写clone
方法:- 方式:让需要克隆的类实现
java.lang.Cloneable
接口,该接口是一个标记接口,没有任何方法。然后在类中重写protected
修饰的clone
方法,在clone
方法中调用super.clone()
来完成对象的克隆。 - 特点:这种方式实现的是浅克隆,即如果对象中包含引用类型的成员变量,克隆后的对象和原对象的引用类型成员变量指向同一个对象。
- 方式:让需要克隆的类实现
- 实现
Serializable
接口并通过对象流进行克隆:- 方式:让需要克隆的类实现
java.io.Serializable
接口,该接口也是一个标记接口。然后通过将对象写入ObjectOutputStream
,再从ObjectInputStream
读取来创建一个新的对象,本质上是通过序列化和反序列化来实现克隆。 - 特点:这种方式实现的是深克隆,即克隆后的对象和原对象的引用类型成员变量会重新创建,不会指向同一个对象,所有层次的对象都会被克隆。
- 方式:让需要克隆的类实现
区别:
- 克隆深度:实现
Cloneable
接口并重写clone
方法默认是浅克隆;而通过实现Serializable
接口利用对象流克隆是深克隆。 - 实现复杂度:实现
Cloneable
接口方式相对简单,只需实现接口并重写clone
方法;而通过Serializable
接口利用对象流克隆,涉及到对象的序列化和反序列化,代码相对复杂。 - 应用场景:如果对象中没有复杂的引用类型嵌套,浅克隆(
Cloneable
方式)就可以满足需求,性能较高;如果对象中包含多层引用类型嵌套,需要完全独立的副本,深克隆(Serializable
方式)更合适。