在Java中,當我們需要復制一個對象時,可以使用淺層復制和深層復制兩種方式。這兩種方式都能達到復制對象的目的,但在具體使用時需要注意它們之間的區別。
淺層復制(shallow copy)顧名思義,只是對對象進行一層簡單的復制。意味著當我們復制一個對象時,只會復制它本身的值,而不會復制其所引用的對象的值。如果被復制的對象中有引用其他對象的屬性,復制后的對象中這些屬性所引用的對象依然是原對象中相應屬性所引用對象的引用。其實現方法一般是使用默認的clone方法,例如:
public class Person implements Cloneable{ private String name; private Listhobbies; public Person(String name, List hobbies) { this.name = name; this.hobbies = hobbies; } public Object clone() throws CloneNotSupportedException { return super.clone(); } }
在上述代碼中,我們在Person類中重寫了clone方法,但并未對其進行任何修改。因此,我們在進行淺層復制時依然可以直接使用該方法。
深層復制(deep copy),與淺層復制相反,它會針對對象內部的所有值都進行遞歸復制,即不僅復制對象本身的值,還會復制對象中所引用的其他對象的值。其實現方法一般是通過序列化的方式實現,例如:
public class Person implements Serializable{ private String name; private Listhobbies; public Person(String name, List hobbies) { this.name = name; this.hobbies = hobbies; } public Person deepCopy() throws IOException, ClassNotFoundException { ByteArrayOutputStream bao = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bao); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (Person) ois.readObject(); } }
在上述代碼中,我們創建了一個新的字節序列流,并將當前對象寫入該流中。然后通過將該字節序列流轉化成字節輸入流的方式,再將其轉化成對象輸入流,最后將其強制類型轉化為原對象所在類的類型,從而達到深層復制的目的。
總之,在進行對象復制時,需要根據實際情況選擇合適的復制方式。如果對象內部沒有其他對象的引用,可以使用淺層復制方式。否則,應使用深層復制方式以確保得到一份真正獨立的對象。
上一篇php imei 算法
下一篇oracle 11