Java 从列表(包含HashMap对象)创建的HashMap上的HashMap.put()方法修改原始列表对象
在我的代码中,我有一个ArrayListcontentChecklist,其中存储HashMap对象。在列表中添加所有HashMap对象之后,如果我从列表中获取最后一个HashMap对象并将其存储在新的HashMap对象中(CheckListMaptemp),并使用Java 从列表(包含HashMap对象)创建的HashMap上的HashMap.put()方法修改原始列表对象,java,hashmap,Java,Hashmap,在我的代码中,我有一个ArrayListcontentChecklist,其中存储HashMap对象。在列表中添加所有HashMap对象之后,如果我从列表中获取最后一个HashMap对象并将其存储在新的HashMap对象中(CheckListMaptemp),并使用CheckListMaptemp.put(“place”,“somePlace”)。它正在修改列表中的原始HashMap项目 public static void main(String[] args) { List&
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);
}
}
publicstaticvoidmain(字符串[]args){
List contentChecklist=new ArrayList();
Map checklIstMap1=新的HashMap();
checklIstMap1.put(“名称”、“名称1”);
checklIstMap1.put(“uuid”,“001”);
contentChecklist.add(checklIstMap1);
Map checklIstMap2=新建HashMap();
checklistmap 2.put(“名称”、“名称2”);
checklistmap 2.put(“uuid”、“002”);
contentChecklist.add(checklistmap 2);
映射CheckListMaptemp=(映射)contentChecklist.get(contentChecklist.size()-1);
CheckListMaptemp.put(“地点”、“某处”);
for(Iterator Iterator=contentChecklist.Iterator();Iterator.hasNext();){
映射对象=(映射)迭代器.next();
String val=(String)object.get(“place”);
系统输出打印项次(val);
}
}
输出为:
无效的
某处
我知道这是正确的行为,但我很想知道当我们调用CheckListMaptemp.put(“place”,“somePlace”)时,contentChecklist内容是如何被修改的代码>在CheckListMaptemp上,即使两者是不同的对象
Map CheckListMaptemp= (Map)contentChecklist.get(contentChecklist.size()-1);
变量CheckListMaptemp
是对Map
对象的引用,该对象包含在contentChecklist.size()-1位置的列表中。因此,使用该引用所做的任何更改都将反映在Map
对象中。该引用未指向另一个Map
对象
变量CheckListMaptemp
是对Map
对象的引用,该对象包含在contentChecklist.size()-1位置的列表中。因此,使用该引用所做的任何更改都将反映在Map
对象中。引用没有指向另一个映射
对象。这就是集合的工作方式。无论何时在集合中添加任何对象,集合都只指向同一对象。它不会创建新对象
在本例中,您创建了两个HashMap
对象checklistmap 1
和checklistmap 2
。当您将其添加到ArrayList
中时,即contentChecklist
,您的ArrayList
仅保留两个映射的引用。它不会创建新地图并将其添加到列表中
所以当你这么做的时候
Map CheckListMaptemp=(Map)contentChecklist.get(contentChecklist.size()-1)代码>。
它只返回映射对象的引用,不会创建新对象并返回
因此,如果您要进行任何修改,它将反映在同一对象中。这就是集合的工作方式。无论何时在集合中添加任何对象,集合都只指向同一对象。它不会创建新对象
在本例中,您创建了两个HashMap
对象checklistmap 1
和checklistmap 2
。当您将其添加到ArrayList
中时,即contentChecklist
,您的ArrayList
仅保留两个映射的引用。它不会创建新地图并将其添加到列表中
所以当你这么做的时候
Map CheckListMaptemp=(Map)contentChecklist.get(contentChecklist.size()-1)代码>。
它只返回映射对象的引用,不会创建新对象并返回
因此,如果您要进行任何修改,它将反映在同一对象中。SideNote:请不要使用rawtypes!看,我添加了泛型,但它在输出上没有任何区别,对吧?不,它不会改变这里的行为。我只是想指出这一点,以防你没有意识到这一点,“即使两者都是不同的对象”。它们不是不同的对象<代码>映射。get
不会生成新对象,它会从映射中为您提供(另一个引用)对象。侧注:请不要使用rawtypes!看,我添加了泛型,但它在输出上没有任何区别,对吧?不,它不会改变这里的行为。我只是想指出这一点,以防你没有意识到这一点,“即使两者都是不同的对象”。它们不是不同的对象<代码>映射。get
不会生成新对象,它会从映射中为您提供(另一个引用)对象。