在java中为新地图指定地图,然后更改新地图也会更改原始地图

时间:2018-03-27 12:03:41

标签: 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);
    System.out.println(prNew);

这是我得到的输出:

{xy=xy}
{xy=xy}

但我期待'pr'保持为:

{ab=ab, xy=xy}

看起来prNew接受了pr的引用,对prNew的任何修改都会修改pr。

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

非常感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:2)

为什么代码不起作用

您在内存中创建以下内容:

enter image description here

因此,当您更改1张地图时,您可以同时更改这两张地图,因为它们是相同的地图。

解决方案

如果你想改变1,同时保持另一个相同,你需要制作地图的副本。

您可以使用带有地图的构造函数来执行此操作。

答案 1 :(得分:1)

  • 目前prprNew引用相同的对象,prprNew上的修改相同,它们只是同一个地图的别名

  • 创建prNew时必须使用the constructor that takes another Map制作副本,所有映射都将复制到新的映射中

//...

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