【问题标题】:HashMap.put() method on an HashMap created from a list (containing HashMap Objects ) modifies the original list Objects从列表(包含 HashMap Objects )创建的 HashMap 上的 HashMap.put() 方法修改原始列表 Objects
【发布时间】:2019-01-24 12:41:20
【问题描述】:

在我的代码中,我有一个 ArrayList contentChecklist 在其中存储 HashMap 对象。在列表中添加所有 HashMap 对象后,如果我从列表中获取最后一个 HashMap 对象并将其存储在新的 HashMap 对象 (CheckListMaptemp) 中并使用 CheckListMaptemp.put("place", "somePlace"); 。它正在修改 List 中存在的原始 HashMap 对象。

public static void main(String[] args) {    
    List<HashMap> contentChecklist = new ArrayList<>();

    Map<String,String> checklIstMap1= new HashMap<>();
    checklIstMap1.put("name", "name1");
    checklIstMap1.put("uuid", "001");

    contentChecklist.add(checklIstMap1);

    Map<String,String>  checklIstMap2= new HashMap<>();
    checklIstMap2.put("name", "name2");
    checklIstMap2.put("uuid", "002");

    contentChecklist.add(checklIstMap2);

    Map<String,String> CheckListMaptemp= (Map<String, String>) contentChecklist.get(contentChecklist.size()-1);

    CheckListMaptemp.put("place", "somePlace");

    for (Iterator iterator = contentChecklist.iterator(); iterator.hasNext();) {
        Map object = (Map) iterator.next(); 
        String val = (String) object.get("place");
        System.out.println(val);
    }
}

输出是:

无效的

某个地方

我知道这是正确的行为,但我很想知道当我们在 CheckListMaptemp 上调用 CheckListMaptemp.put("place", "somePlace"); 时如何修改 contentChecklist 内容,即使两者不同对象。

【问题讨论】:

  • 旁注:请不要使用 rawtypes!见stackoverflow.com/questions/2770321/…
  • 我添加了 Generics ,但它对输出没有任何影响吧?
  • 不,它不会改变这里的行为。只是想指出这一点,以防您不知道这一点。
  • “即使两者是不同的对象”。它们是不是不同的对象。 Map.get 不会创建新对象,它会为您提供(另一个引用)地图中的对象。

标签: java hashmap


【解决方案1】:

这就是 Collection 的工作方式。每当您在集合中添加任何对象时,您的集合都指向同一个对象。它不会创建新对象。

在您的情况下,您创建了两个HashMap 对象checklIstMap1checklIstMap2。当您将其添加到ArrayListcontentChecklist 时,您的ArrayList 只需保留两个地图的参考。它不会创建新的地图并将其添加到列表中。

所以当你这样做时 Map&lt;String,String&gt; CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);。 它只是返回地图对象的引用,不会创建新的对象并返回。

因此,如果您进行任何修改,它将反映在同一个对象中。

【讨论】:

    【解决方案2】:
    Map CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);
    

    变量CheckListMaptemp 是对Map 对象的引用,该对象包含在位置contentChecklist.size()-1 的列表中。因此,您使用该引用所做的任何更改都将反映在该 Map 对象中。引用不指向另一个 Map 对象。

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2023-02-10
      • 2022-11-14
      • 1970-01-01
      • 2014-08-01
      相关资源
      最近更新 更多