java的深拷贝和浅拷贝

浅拷贝:

public class PrototypeClass implements Cloneable {
    private List<String> params = new ArrayList<String>();

    @Override
    protected PrototypeClass clone()  {
        PrototypeClass prototypeClass = null;
        try {
            prototypeClass =  (PrototypeClass) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototypeClass;
    }
    public void setValue(String param)
    {
        this.params.add(param);
    }

    public List getValue(){
        return this.params;
    }
}

测试一下:

public class PrototypeClassTest {
    @Test
    public void test(){
        PrototypeClass prototypeClass = new PrototypeClass();
        prototypeClass.setValue("12");
        PrototypeClass clone = prototypeClass.clone();
        clone.setValue("13");
        System.out.println(prototypeClass.getValue());
    }
}

运行一下你会发现结果并不是你想象的["12"],而是["12","13"],这种情况是因为Java做了一个偷懒的拷贝动作,object对象提供的clone()方法只是拷贝了对象,其对象内部的数组、引用对象(String是一个特殊的引用对象,它是没有clone方法的,是能够被拷贝的,)都不会被拷贝,还是指向原生对象的内部元素地址,这种拷贝叫做浅拷贝。

深拷贝:

public class PrototypeClass implements Cloneable {
    private ArrayList<String> params = new ArrayList<String>();

    @Override
    protected PrototypeClass clone()  {
        PrototypeClass prototypeClass = null;
        try {
            prototypeClass =  (PrototypeClass) super.clone();
            this.params = (ArrayList<String>) params.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototypeClass;
    }
    public void setValue(String param)
    {
        this.params.add(param);
    }

    public List getValue(){
        return this.params;
    }
}

只需要将类中的成员变量单独拷贝,这样便是深拷贝。

猜你喜欢

转载自blog.csdn.net/zhm123098/article/details/82957810