在我的代码中,我有一个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);
}
}
输出为:
空值我知道这是正确的行为,但是我很想知道当我们在 CheckListMaptemp 上调用CheckListMaptemp.put("place", "somePlace");
时,如何修改 contentChecklist 内容,即使两者是不同的对象。
答案 0 :(得分:2)
Map CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);
变量CheckListMaptemp
是对列表中位置Map
上包含的contentChecklist.size()-1
对象的引用。因此,您使用该引用所做的任何更改都将反映在该Map
对象中。引用不指向另一个Map
对象。
答案 1 :(得分:2)
这就是集合的工作方式。每当您在集合中添加任何对象时,您的集合便指向同一对象。它不会创建新对象。
在您的情况下,您创建了两个HashMap
对象checklIstMap1
和checklIstMap2
。当您将其添加到ArrayList
中,即contentChecklist
时,您的ArrayList
仅持有两个地图的参考。它不会创建新地图并将其添加到列表中。
所以当你这样做
Map<String,String> CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);
。
它只是返回地图对象的引用,不会创建新的Object并返回。
因此,如果您要进行任何修改,它将反映在同一对象中。