java中的深拷貝


對象拷貝有時讓我們忽視其重要性,又或者因為想當然而導致若干程序問題。

淺拷貝

淺拷貝即普通拷貝,即對要拷貝的對象進行復制。例如對於Entity類:

class Entity{
    int a;
    String b;
    List<String> c;
    List<Object> d;
}

對於Entity類的對象entity,把entity的對象直接賦給另一個變量也算是一種淺拷貝,這樣就有兩個變量指向堆中同一個對象。更近一層的淺拷貝是還要對

entity對象中的各個屬性進行復制,即重新new一個Entity類對象,再將a、b、c、d屬性復制賦給新創建的對象:

Entity entity2 = new Entity();
entity2.a = entity.a;
entity2 b = entity.b;
entity2.c = entity.c;
entity2.d = entity.d;

這樣得到的拷貝對象是一種淺拷貝,因為這樣直接賦值的結果是對於對象屬性,兩個對象entity和entity2中對應的屬性還是指向同一塊內存區域,二者並非

真正獨立。如此若要對其中的屬性進行改變,則會同時影響這兩個對象。

即使對對象屬性進行重新new出新空間,重新按元素賦值,也不能保證屬性對象中的屬性也是對象,這樣層層推進,操作起來很是不便。

深拷貝

要實現深拷貝,除了逐層賦值之外,還有一種比較簡單直觀的方式即序列化。序列化將內存對象以文件的形式保存在磁盤,若要重新恢復到內存,需要重新

開辟內存,這樣兩個對象就會實現完全獨立,互不影響,但是需要對不能序列化的字段進行單獨處理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM