当前位置: 首页 > 面试题库 >

如何在Java中复制HashMap(不是浅表复制)

耿炎彬
2023-03-14
问题内容

我需要制作一个副本,`HashMap<Integer, List

但是当我更改副本中的某些内容时,我希望原件保持原样。也就是说,当我List 从副本中删除某项内容时,它会保留在List `原件中。

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

mapCopy = new HashMap<>(originalMap);
mapCopy = (HashMap) originalMap.clone();

我对吗?

除了遍历所有键和所有列表项并手动复制之外,还有更好的方法吗?


问题答案:

没错,浅表副本不能满足您的要求。它将具有List原始地图中的副本,但这些副本List将引用相同的List对象,因此对Listfrom
的修改HashMap将出现在Listfrom的对应内容中HashMap

HashMap在Java中,没有提供深拷贝功能,因此您仍然必须遍历所有条目,put并在new
条目中进行遍历HashMap。但是您也应该List每次都复制一份。像这样:

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对象,并且所做的更改未反映在所List复制的对象中HashMap,那么您也需要为其创建新副本。



 类似资料:
  • 有人告诉我构造函数复制是一种浅层复制方法。 通常情况下,如果我修改了List ints的第一个元素,那么List intscope中的相应元素应该已经修改为31了,对吗?因为变量intscope和ints引用了同一个对象,但我得到了这个输出。 举个例子,我的意思是: 我得到这样的输出: 因为变量arr和arr2引用了同一个对象。如果我修改了数组中的一个元素,那么其他元素也会产生影响。当我使用列表进

  • 本文向大家介绍如何在JavaScript中浅复制对象?,包括了如何在JavaScript中浅复制对象?的使用技巧和注意事项,需要的朋友参考一下 Underscore.js,JavaScript的一个库,推出了一种称为 _.extend() ,以浅拷贝中的JavaScript对象。此方法将源 对象中的所有属性复制到目标 对象,然后返回目标对象。在此引用 用于复制,但不用于复制。  语法 它接受对象并

  • 只是想通过查看代码来了解的工作原理。添加元素时,会发生以下情况: 密钥的hashcode已获取 哈希函数应用于结果 方法indexFor应用于2的结果。这给出了相应桶中的第一个条目。然后循环遍历桶中的链表-找到结尾并添加元素。 indexOf的实施是: 我不明白indexOf方法中的诀窍。有人能解释一下吗? 谢谢

  • 问题内容: 您能告诉我Java克隆是什么意思吗?什么是深层复制和浅层复制,请举例说明 问题答案: 我强烈建议阅读有效的Java第二版中的第11项

  • 问题内容: 如何在Java中复制对象? 问题答案: 创建一个副本构造函数: 每个对象还有一个克隆方法,可用于复制对象,但不要使用它。创建类和执行不正确的克隆方法太容易了。

  • 本文向大家介绍浅谈Javascript中深复制,包括了浅谈Javascript中深复制的使用技巧和注意事项,需要的朋友参考一下 在javascript中,所有的object变量之间的赋值都是传地址的,可能有同学会问哪些是object对象。举例子来说明可能会比较好: 所以其实我们深复制主要需要处理的对象就是object对象,非object对象只要直接正常的赋值就好。我实现js深复制的思路就是: 遍历