从列表(包含HashMap Objects)创建的HashMap上的HashMap.put()方法修改原始列表Objects

时间:2019-01-24 12:41:20

标签: java hashmap

在我的代码中,我有一个ArrayList contentChecklist ,用于在其中存储HashMap对象。在列表中添加所有HashMap对象之后,如果我从列表中获取了最后一个HashMap对象,并将其存储在新的HashMap对象( CheckListMaptemp )中,请使用CheckListMaptemp.put("place", "somePlace");。它正在修改列表中存在的原始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);
    }
}

输出为:

空值

somePlace

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

2 个答案:

答案 0 :(得分:2)

Map CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);

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

答案 1 :(得分:2)

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

在您的情况下,您创建了两个HashMap对象checklIstMap1checklIstMap2。当您将其添加到ArrayList中,即contentChecklist时,您的ArrayList仅持有两个地图的参考。它不会创建新地图并将其添加到列表中。

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

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