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

Java深拷貝和淺拷貝

指向 supported not set null 元素 string new main

淺拷貝和深拷貝

在具體解釋Java深拷貝和淺拷貝之前,我們先看個例子,代碼如下:

public class Thing implements Cloneable {
    // 定義一個私有變量
    private ArrayList<String> arraylist = new ArrayList<String>();

    @Override
    public Thing clone() {
        Thing thing = null;
        try {
            thing = (Thing)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return thing;
    }

    public void setValue(String value) {
        this.arraylist.add(value);
    }

    public ArrayList<String> getValue() {
        return this.arraylist;
    }
}

下面看一下淺拷貝測試:

 1 public class Client {
 2     public static void Main(String[] args) {
 3         Thing thing = new Thing();
 4         thing.setValue("張三");
 5 
 6         // 拷貝一個對象
 7         Thing cloneThing = thing.clone();
 8         cloneThing.setValue("李四");
 9 
10         // 打印結果是[張三,李四]
11         System.out.println(thing.getValue());
12 } 13 }

這裏java做了一個偷懶的拷貝動作,Object類提供的clone()方法只是提供了拷貝本地對象,其對象內部的數組、引用對象等都不拷貝,還是指向原生的內部元素地址,這種拷貝稱為淺拷貝。

那麽下面看一下如何深拷貝??

 1 public class Thing implements Cloneable {
 2     // 定義一個私有變量
 3     private ArrayList<String> arraylist = new ArrayList<String>();
 4 
 5     @Override
 6     public
Thing clone() { 7 Thing thing = null; 8 try { 9 thing = (Thing)super.clone(); 10 11 // 深度拷貝加上這句 12 thing.arraylist = (ArrayList)this.arraylist.clone(); 13 } catch (CloneNotSupportedException e) { 14 e.printStackTrace(); 15 } 16 17 return thing; 18 } 19 20 public void setValue(String value) { 21 this.arraylist.add(value); 22 } 23 24 public ArrayList<String> getValue() { 25 return this.arraylist; 26 } 27 }

另外最後註意一下對象的clone()方法和對象內的final關鍵詞是沖突的

Java深拷貝和淺拷貝