【问题标题】:Assigning a map to a new map in java, and then changing the new map also changes original map [duplicate]在java中将地图分配给新地图,然后更改新地图也会更改原始地图[重复]
【发布时间】:2018-09-05 19:59:26
【问题描述】:

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

    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。

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

【问题讨论】:

标签: java collections


【解决方案1】:

为什么代码不起作用

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

因此,当您更改 1 张地图时,您会同时更改两者,因为它们是同一张地图。

解决方案

如果要更改 1 而另一个保持不变,则需要制作地图的副本。

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

【讨论】:

    【解决方案2】:
    • 目前prprNew 引用same 对象,对prprNew 的修改是相同的,它们只是同一个Map 的别名

    • 当你创建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}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 2022-01-08
      • 2021-06-02
      • 2018-05-17
      • 1970-01-01
      相关资源
      最近更新 更多