Java的深度拷贝分为克隆(实现Java的Clone接口)和序列化(实现Java的Serializable接口)两种,由于序列化有不同的方式,下面分析一下每种的注意事项和性能对比。
一、继承Cloneable接口
可以使用Java提供的Clone方式进行对象的拷贝,其性能是最佳的,甚至高过new 关键字。使用new关键字创建对象,如果是第一次创建则会经历类加载机制的双亲委派(加载、验证、准备、解析、初始化)。即使非第一次创建也会经历(常量池判断,内存分配,值初始化,init方法调用,栈中对象的引用等)等过程。
继承Cloneable接口,重写Object的clone方法。如下:
public class DeepCopyEntity implements Cloneable {
@Override
protected DeepCopyEntity clone() {
try {
return (DeepCopyEntity)super.clone();
} catch (CloneNotSupportedException e) {
log.info("没有实现克隆接口");
return null;
}
}
}
但是我们在使用的时候,需要每个对象都编写这样的代码。可以优化为继承自类似下面的 CloneSupport<T> 类(前体是没有继承其他的类):