Java - clone 方法属于浅拷贝 OR 深拷贝?

Posted 程序员牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java - clone 方法属于浅拷贝 OR 深拷贝?相关的知识,希望对你有一定的参考价值。

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();
        
    

以上是关于Java - clone 方法属于浅拷贝 OR 深拷贝?的主要内容,如果未能解决你的问题,请参考以下文章

Java专题十九:浅拷贝与深拷贝

Java数组调用clone()方法,返回的对象是深拷贝还是浅拷贝?

java 深拷贝与浅拷贝机制详解

java深拷贝和浅拷贝

Java深拷贝和浅拷贝(深克隆和浅克隆)

java浅拷贝和深拷贝