在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;
}