首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中复制HashMap (非浅层复制)

如何在Java中复制HashMap (非浅层复制)
EN

Stack Overflow用户
提问于 2015-02-03 07:07:47
回答 5查看 67.7K关注 0票数 61

我需要制作HashMap<Integer, List<MySpecialClass> >的副本,但当我更改副本中的某些内容时,我希望原始版本保持不变。也就是说,当我从副本中删除List<MySpecialClass>中的内容时,它会保留在原始的List<MySpecialClass>中。

如果我理解正确的话,这两种方法只会创建我不想要的浅拷贝:

代码语言:javascript
复制
mapCopy = new HashMap<>(originalMap);
mapCopy = (HashMap) originalMap.clone();

我说的对吗?

有没有更好的方法来做到这一点,而不是只迭代所有的键和所有的列表项,并手动复制它?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-02-03 07:16:14

你说得对,肤浅的拷贝不能满足你的要求。它将具有原始地图中的List的副本,但这些List将引用相同的List对象,因此一个List中对HashMap的修改将出现在另一个List中的相应HashMap中。

在Java语言中,没有为HashMap提供深度复制,因此您仍然需要遍历所有条目,并在新的HashMap中对它们执行put操作。但您也应该每次都复制一份List。如下所示:

代码语言:javascript
复制
public static HashMap<Integer, List<MySpecialClass>> copy(
    HashMap<Integer, List<MySpecialClass>> original)
{
    HashMap<Integer, List<MySpecialClass>> copy = new HashMap<Integer, List<MySpecialClass>>();
    for (Map.Entry<Integer, List<MySpecialClass>> entry : original.entrySet())
    {
        copy.put(entry.getKey(),
           // Or whatever List implementation you'd like here.
           new ArrayList<MySpecialClass>(entry.getValue()));
    }
    return copy;
}

如果要修改单个MySpecialClass对象,并且不希望更改反映在复制的HashMapList中,则还需要创建新的副本。

票数 34
EN

Stack Overflow用户

发布于 2015-02-03 07:25:02

不幸的是,这确实需要迭代。但对于Java 8 streams来说,这是相当微不足道的:

代码语言:javascript
复制
mapCopy = map.entrySet().stream()
    .collect(Collectors.toMap(e -> e.getKey(), e -> List.copyOf(e.getValue())))
票数 40
EN

Stack Overflow用户

发布于 2017-09-06 20:02:26

序列化到json,然后反序列化:

代码语言:javascript
复制
Map<String, Object> originalMap = new HashMap<>();
String json = new Gson().toJson(originalMap);
Map<String, Object> mapCopy = new Gson().fromJson(
    json, new TypeToken<Map<String, Object>>() {}.getType());

对于特殊的类,您可能需要write a custom deserializer

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28288546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档