Java中的對象賦值常常被稱為拷貝,但是實際上對象的拷貝分為淺拷貝和深拷貝兩種。淺拷貝僅僅是復制了對象的 棧 空間,而深拷貝則會復制對象的 所有 空間。
以下是Java中實現淺拷貝和深拷貝的方法。
public class Person implements Cloneable { private String name; private int age; private Listhobbies = new ArrayList<>(); @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } //實現淺拷貝 public Person shallowCopy() throws CloneNotSupportedException { return (Person) this.clone(); } //實現深拷貝 public Person deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (Person) ois.readObject(); } //省略了getters和setters,以及構造方法 }
上述代碼中,我們定義了一個Person類,并重寫了java.lang.Object的clone方法。在Person類中,我們實現了shallowCopy和deepCopy方法,用于淺拷貝和深拷貝。
shallowCopy方法實現很簡單,它直接調用Object對象原生的clone方法。
deepCopy方法的實現則需要通過將對象序列化和反序列化來實現深拷貝。
深拷貝會將對象的所有引用類型的子對象進行深拷貝,以保證完全獨立和獨立的可變狀態。然而,在使用深拷貝的時候要注意,子對象必須全部是可序列化的,否則會拋出異常。
總之,淺拷貝和深拷貝都有各自的特點,需要根據實際需求進行選擇。