深度复制具有集合值的Java Map

时间:2013-12-20 16:33:59

标签: java map hashmap

我有一张地图(Map<String, Set<String>>),并希望将地图复制到新地图对象。但是,如果我只是将地图提供给说HashMap构造函数(new HashMap<String, Set<String>>(oldMap)),它将不会执行完整副本,并且仅复制对该集合的引用,该集合可以被修改并且这些更改将会反映在新地图中。

除了迭代每个键/值对并为每个组创建新的HashSet然后将其添加到地图之外,是否有更简单的方法来执行完整副本?

3 个答案:

答案 0 :(得分:1)

你需要深度克隆。请查看https://code.google.com/p/cloning/

上的示例

答案 1 :(得分:1)

这里有一些关于深度克隆的讨论:

Java HashMap - deep copy

在这种情况下很难,因为新的地图和集需要重建自己。你还需要克隆Set的内容吗?如果是这样,那么你可以序列化然后反序列化整个集合。

迭代自己几乎肯定会更快,并且可以让你控制克隆的深度。序列化将会变慢,但只要对象树中的所有内容都是可序列化的,它就会复制对象树中的所有内容并维护循环引用等内容。(例如,如果地图中有2个键指向同一个Set对象,则迭代将它分成2组,序列化将保持链接)。

答案 2 :(得分:0)

如果您不想使用外部库,只想复制此特定地图,您可以这样做:

HashMap<String, HashSet<String>> copy = new HashMap<>();
for(String newKey : oldMap.keySet()){
    copy.put(newKey, new HashSet<String>(oldMap.get(newKey)));
}

其中oldMap是您要复制的地图。这对我有用。