在Java中克隆地图的最佳方法是什么?

时间:2018-08-03 08:51:41

标签: java deep-copy

我有一个由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;
    }
}

这很好用,但是该方法效果不佳。

我的问题是,如何改善此处的性能?

0 个答案:

没有答案