我有一个由Map接口表示的通用值对象,其中包含不同的可序列化对象,包括数组。 现在,我需要创建该对象的副本。一个简单的副本,通过:
Map<String,Object> m1=new <String,Object>HashMap();
m1.put("some_key","some value");
....
Map<String,Object> m2=new <String,Object>HashMap();
m2.putAll(m1);
仅当值是基本对象时才起作用。但是,例如,如果值是字节数组:
byte[] bytes=...
m1.put("another_key",bytes);
此方法putAll()不会按值而是按引用复制此对象。因此,在原始映射中操作此字节数组也会在副本中对其进行更改。问题变得更加严重,因为就我而言,地图还可能包含嵌入式地图和无法预料的复杂结构。
为解决此问题,我通过序列化/反序列化对象结构来进行深层复制:
private Object deepCopyOfMap(Map<String, List<Object>> map) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
// serialize and pass the object
oos.writeObject(map);
oos.flush();
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (IOException e) {
logger.warning("Unable to clone values of ItemCollection - " + e);
return null;
} catch (ClassNotFoundException e) {
logger.warning("Unable to clone values of ItemCollection - " + e);
return null;
}
}
这很好用,但是该方法效果不佳。
我的问题是,如何改善此处的性能?