如何使用List深度克隆Map作为值

时间:2014-05-25 15:31:25

标签: java clone

这是深度克隆此数据结构示例的最佳方式:Map<String, List<Object>>

Map<String, List<Object>> mapB = new LinkedHashMap<String, List<Object>>();
for(String key: mapA.keySet()){
      mapB.put(key, new ArrayList<Object>());
      mapB.get(key).addAll(mapA.get(key));
}

感谢您的时间。

3 个答案:

答案 0 :(得分:1)

如果您不想要打印对象的深层副本,那就没问题了。

答案 1 :(得分:1)

深度克隆的另一种方法是使用序列化。以下方法显示了如何完成此操作:

    public Object deepClone(Object obj) {
    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(obj);

        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        return ois.readObject();
    } catch (IOException e) {
        return null;
    } catch (ClassNotFoundException e) {
        return null;
    }
}

apache commons lang SerializationUtils提供了一种通用方法来执行此操作。

两种方式都假设对象图中的所有对象都实现了可序列化。

答案 2 :(得分:1)

  

这是深度克隆此数据结构的最佳方式

或多或少,是的。您可以使用将源Collection作为参数的ArrayList构造函数使其更短一些,并且通过迭代键值对而不是再次查找每个键来更高效(但更加冗长),但它相同的事情

Map<String, List<Object>> mapB = new LinkedHashMap<>();
for (Map.Entry<String, List<Object>> entry : mapA.entrySet()) {
    mapB.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}