Java中的深拷貝是指將一個對象或數組的所有屬性都復制一遍,新建一個對象或數組,兩個對象互不影響,即兩個對象在內存中的地址不同。與之相對的是淺拷貝,只是將對象或數組的引用復制一遍,新建的對象或數組會與原來的對象或數組共用內部的變量,容易引起異常。
在Java中,深拷貝數組可以通過以下代碼實現:
public static int[] deepCopy(int[] orig) { int[] copy = new int[orig.length]; System.arraycopy(orig, 0, copy, 0, orig.length); return copy; }
在這個例子中,我們首先新建一個與原數組長度相同的數組,然后使用System.arraycopy()方法進行拷貝,將原數組的所有元素復制到新的數組中。
深拷貝對象的實現方法有很多,其中一種比較常用的是使用序列化/反序列化:
public static Object deepCopy(Object orig) throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(bos); out.writeObject(orig); out.flush(); out.close(); ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bos.toByteArray())); Object copy = in.readObject(); in.close(); return copy; }
在這個例子中,我們通過將對象序列化成字節數組,然后再反序列化得到一個新的對象。這樣可以確保新的對象與原來的對象沒有任何關聯。
需要注意的是,如果對象里有引用類型的成員變量,我們在序列化和反序列化的時候需要確保這些引用類型也是深拷貝。否則,新的對象里的引用類型指向的還是原來對象里的成員變量,這就不是真正的深拷貝了。