1. 程式人生 > >java的深拷貝和淺拷貝

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;
    }
}

只需要將類中的成員變數單獨拷貝,這樣便是深拷貝。