Java 对象深度clone的两种方式
实现Cloneable接口
- 该类及其所有需要复制的引用类型的成员变量 实现Cloneable接口
- 该类及其所有需要复制的引用类型的成员变量 重写 clone()方法
实例
- 无
特点
- 实现麻烦, 特别是当引用类型的成员变量较多时
- 性能好
序列化实现
- 该类及所有需要复制的引用类型成员变量实现Serializable接口
- 将对象序列化后再反序列化出新的对象
实例
public User deepClone() {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = null;
ByteArrayInputStream bi;
ObjectInputStream oi = null;
try {
oo = new ObjectOutputStream(bo);
oo.writeObject(this);
bi = new ByteArrayInputStream(bo.toByteArray());
oi = new ObjectInputStream(bi);
return (User) oi.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
特点
- 实现相对简单
- 性能较差
性能对比
创建User 类 ,增加一个HashMap 成员变量,分别通过以上两种方式进行对象复制。
- 结果
| 方式 | 执行次数 | 耗时(ms) |
|---|---|---|
| 通过重写Clone方法 | 10000 | 3 |
| 序列化 | 10000 | 714 |
总结
通过性能对比,可以看出,两种方式,性能相差悬殊,且随着需要复制对成员变量增多,性能差距会更加明显。
所以若对性能要求较低,为方便可以通过序列化方式实现,并且不建议直接在主线程操作,否则,为保证性能,仍需通过实现Cloneable接口方式来完成。












网友评论