在java中将地图分配给新地图,然后更改新地图也会更改原始地图

在java中将地图分配给新地图,然后更改新地图也会更改原始地图,java,collections,Java,Collections,我有一个用例,看起来像这样: Map<String,String> pr = new HashMap<>(); pr.put("ab","ab"); pr.put("xy","xy"); Map<String,String> prNew = new HashMap<>(); prNew = pr; prNew.remove("ab"); System.out.println(pr);

我有一个用例,看起来像这样:

    Map<String,String> pr = new HashMap<>();
    pr.put("ab","ab");
    pr.put("xy","xy");
    Map<String,String> prNew = new HashMap<>();
    prNew = pr;
    prNew.remove("ab");
    System.out.println(pr);
    System.out.println(prNew);
但我希望“公共关系”保持为:

{ab=ab, xy=xy}
看起来prNew引用了pr,对prNew的任何修改也会修改pr

那我该怎么解决这个问题呢?在我的用例中,我需要复制一份pr并进行一些更改,但它不应影响原始pr

任何帮助都将不胜感激。谢谢。

  • 目前,
    pr
    prNew
    引用了相同的对象,对
    pr
    prNew
    的修改是相同的,它们只是同一地图的别名

  • 当您创建
    prNew
    时,您必须使用,以便复制,所有映射都将复制到新映射中

/。。。
Map prNew=新HashMap(pr);//为什么代码不起作用
您可以在内存中创建以下内容:

因此,当您更改一个贴图时,您将同时更改这两个贴图,因为它们是同一个贴图

解决方案 如果要更改1,同时保持另一个不变,则需要复制地图


您可以使用接受映射的构造函数来执行此操作。

您希望复制映射,而不仅仅是分配它。HashMap已经有一个可以使用的复制构造函数:
prNew=newHashMap(pr)它不是“看起来像”==>它是!请阅读以下内容以供参考:。也:
{ab=ab, xy=xy}
//...

Map<String, String> prNew = new HashMap<>(pr); // <--
prNew.remove("ab");
System.out.println(pr);     // {ab=ab, xy=xy}
System.out.println(prNew);  // {xy=xy}