clone 方法是浅拷贝
1、Java 的 Object 类有 clone 方法,子类调用必须实现 Cloneable 接口
protected native Object clone() throws CloneNotSupportedException;
2、clone 方法默认是浅拷贝的,即返回一个新的对象,但是新对象里的引用类型变量地址指向的还是原对象内引用类型地址
3、可以实现不完全的深拷贝,即原对象内所有引用类型变量都实现 Cloneable 接口。原对象重写clone 方法时,这些引用类型变量也调一次 clone 方法。
4、彻底深拷贝,几乎是不可能实现的。因为对象里的引用类型变量经常出现层层调用关系。
5、深拷贝巧用:Fastjson、Kryo(推荐)
Fastjson
/** * Fastjson 工具类 */ public static class FastjsonUtil { /** * 克隆(深拷贝) * @param source */ public static <T> T clone(T source) { String jsonString = JSON.toJSONString(source); return (T) JSON.parseObject(jsonString, source.getClass()); } }
- Kryo
/** * Kryo 工具类 */ public static class KryoUtil { /** * Kryo ThreadLocal */ private static final ThreadLocal<Kryo> KRYO_THREAD_LOCAL = new ThreadLocal<>(); /** * 克隆(深拷贝) * @param source */ public static <T> T clone(T source) { try { Kryo kryo = KRYO_THREAD_LOCAL.get(); if (null == kryo) { kryo = new Kryo(); kryo.setRegistrationRequired(false); KRYO_THREAD_LOCAL.set(kryo); } T target = kryo.copy(source); return target; } finally { KRYO_THREAD_LOCAL.remove(); } } }