1. 程式人生 > 實用技巧 >java 深拷貝與淺拷貝

java 深拷貝與淺拷貝

對於所有的基本型別都是淺拷貝,不論什麼方式;

但對於引用型別,當呼叫object的clone方法時,除String型別外,其他都為深拷貝;對於String物件型別要實現深拷貝必須要手動建立(new)一個新的String物件;

public class CloneAbleDemo {

    public static void main(String[] args) throws CloneNotSupportedException {
        CloneAbleImpl cloneAble = new CloneAbleImpl(1);
        cloneAble.setS("1");
        // 如果當前類未實現CloneAble介面,則會直接丟擲CloneNotSupportedException異常資訊
        CloneAbleImpl clone = cloneAble.clone();
        System.out.println(clone.getValue());
        //結果為false,深拷貝
        System.out.println(cloneAble == clone);
        // 當為淺拷貝時,結果為true
        // 資料流程為 cloneAble物件的s欄位 -> clone物件的s欄位; 對於String型別的複製實際預設是淺拷貝
        System.out.println(cloneAble.getS() == clone.getS());
        // 當為深拷貝時,上述結果為false,而當前結果為true
        System.out.println(cloneAble.getS().equals(clone.getS()));
    }
}


class CloneAbleImpl implements Cloneable {
    private final int value;
    private String s;

    CloneAbleImpl(int value) {
        this.value = value;
    }

    public int getValue() {
        return this.value;
    }

    public String getS() {
        return this.s;
    }

    public void setS(String s) {
        this.s = s;
    }


    /**
     * 重寫object中的clone方法,並修改object中的clone的返回值和訪問性
     *
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    public CloneAbleImpl clone() throws CloneNotSupportedException {
        CloneAbleImpl cloneAble = (CloneAbleImpl) super.clone();
        // 深拷貝,建立了一個新的String物件,對於s而言此時就是深拷貝
        cloneAble.setS(new String(this.s));
        return cloneAble;
    }
}