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;
}
哈哈哈哈~~~其實挺簡單的!