java 實現Map的深復制


在java中有一個比較有趣的特性,在對對象進行=賦值,或者clone時候一般都是我們所說的淺復制,

Object A = B;

也就是說我們獲取的並非在堆中重新分配的一塊內存,而是一個指向原有數據內存的一個引用。
這樣的后果就是我們修改了A中的屬性,那么B的屬性也會同時發生變化,因為他們兩個本身就指向同一個對象,所以變化一個另外一個也隨着變化。

在Map中提供的一個putAll方法,可以部分解決這個問題,(為什么是部分呢?因為putAll方法只能對基本數據類型進行深復制,對於對象類型完全也是無力),因此急需一個好的解決方案來進行對象的深復制
有一個方法是,使用序列化Serializable這個接口可以完成深拷貝的操作,但遺憾的是Map對象並沒有實現Serializable接口,不能直接對接口進行深復制操作。

public interface Map<K,V> {...}

但是作為Map的子類,HashMap實現了Serialization,因此可以通過以下的方式實現深復制。

 @SuppressWarnings("unchecked")
 public static <T extends Serializable> T clone(T obj) {
     T clonedObj = null;
     try {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ObjectOutputStream oos = new ObjectOutputStream(baos);
         oos.writeObject(obj);
         oos.close();

         ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
         ObjectInputStream ois = new ObjectInputStream(bais);
         clonedObj = (T) ois.readObject();
         ois.close();
     } catch (Exception e) {
         e.printStackTrace();
     }
    return clonedObj;
 }


免責聲明!

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



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