1. 程式人生 > >java初學者基礎知識積累---(1)深拷貝和淺拷貝

java初學者基礎知識積累---(1)深拷貝和淺拷貝

本人是新手,為了以後的厚積薄發,也為了把自己的一些學習經驗寫下來與需要的朋友們分享,今兒特地早起理理!

  定義:

    淺拷貝:只複製一個物件,物件內部存在的、指向其他物件的陣列或者引用則不復制。

    深拷貝:物件、物件內部的引用都複製。

    為了更好的理解它們的區別,假設有一個物件A,它包含有物件A1和物件A2兩個物件

 

    物件A進行淺拷貝後,得到物件B,但是物件A1和A2並沒有被拷貝

   而 物件A進行深拷貝,得到物件B的同時,A1和A2連同它們的引用也被拷貝  在理解了深拷貝和淺拷貝後,我們來看看Java的深拷貝和淺拷貝實現:

java.lang.Object中的clone()方法預設是返回一個前拷貝物件,因此如果要用clone()方法實現一個深拷貝,我們必須對每個物件的clone()方法進行特別實現,當物件層次複雜的時候,這樣做不但困難而且浪費時間、容易出現錯誤,特別有時候不但需要深拷貝同時也對這個物件進行淺拷貝的時候,你會發現寫這個clone()方法真不是一個好的解決方案。那麼除了clone()方法,我們還可以怎麼實現呢?答案是序列!

實現步驟和思路是把要拷貝的物件輸出成byte array,然後再利用ObjectInputStream轉換出新的物件。程式碼如下:

public static Object copy(Object oldObj) {  

    Object obj = null;  

    try {  

        // Write the object out to a byte array  

        ByteArrayOutputStream bos = new ByteArrayOutputStream();  

        ObjectOutputStream out = new ObjectOutputStream(bos);  

        out.writeObject(oldObj);  

        out.flush();  

        out.close();  

        // Retrieve an input stream from the byte array and read  

        // a copy of the object back in.  

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());   

        ObjectInputStream in = new ObjectInputStream(bis);  

        obj = in.readObject();  

    } catch (IOException e) {  

        e.printStackTrace();  

    } catch (ClassNotFoundException cnfe) {  

        cnfe.printStackTrace();  

    }  

    return obj;  

哈哈哈哈~~~其實挺簡單的!