HashMap存入多组值后仅最后一组生效及集合使用疑问
问题分析与解决:HashMap重复引用导致List元素全部相同
嘿,我来帮你拆解下你遇到的问题,顺便理清HashMap、List和ArrayList的核心用法~
问题到底出在哪?
你代码里的核心问题是重复使用了同一个subSourceMap对象的引用,而不是每次创建新的HashMap实例。
看这段关键代码:
subSourceMap = new HashMap<>(); // 这里三次put同一个键,每次都会覆盖之前的值,最后name变成"ggfgf" subSourceMap.put("name", "bobby"); subSourceMap.put("address", "xxx.xxxx@xxx.co.id"); subSourceMap.put("name", "2sadasd"); subSourceMap.put("address", "xxx.xxxx@xxx.co.id"); subSourceMap.put("name", "ggfgf"); subSourceMap.put("address", "xxx.xxxx@xxx.co.id"); // 三次添加的都是同一个subSourceMap对象的引用 myMap.add(0, subSourceMap); myMap.add(1, subSourceMap); myMap.add(2, subSourceMap);
首先,HashMap的键是唯一的,你连续三次put("name", ...),后面的值会直接覆盖前面的,所以这个subSourceMap最终的name是最后一次的"ggfgf"。其次,你把同一个对象三次加到List里,List里的三个元素其实指向同一个HashMap,所以输出时三个元素自然一模一样。
怎么解决?
每次要添加新的键值对组到List时,都要创建一个新的HashMap实例,确保每个元素都是独立的对象:
Map<String, Object> departmentPHSSuportEmail = new HashMap<String, Object>(); List<Map<String , Object>> myMap = new ArrayList<Map<String,Object>>(); // 创建第一个独立的HashMap Map<String, Object> subMap1 = new HashMap<>(); subMap1.put("name", "bobby"); subMap1.put("address", "xxx.xxxx@xxx.co.id"); myMap.add(subMap1); // 创建第二个独立的HashMap Map<String, Object> subMap2 = new HashMap<>(); subMap2.put("name", "2sadasd"); subMap2.put("address", "xxx.xxxx@xxx.co.id"); myMap.add(subMap2); // 创建第三个独立的HashMap Map<String, Object> subMap3 = new HashMap<>(); subMap3.put("name", "ggfgf"); subMap3.put("address", "xxx.xxxx@xxx.co.id"); myMap.add(subMap3); // 后面的代码保持不变 Map<String, Object> attachment = new HashMap<String, Object>(); attachment.put(ApplicationConstanta.MsExchange.TYPE, ""); attachment.put(ApplicationConstanta.MsExchange.VALUE, ""); departmentPHSSuportEmail.put(ApplicationConstanta.EmailForwardString.ATTACHMENT, attachment); Map<String, Object> subSource = new HashMap<String, Object>(); subSource.put(ApplicationConstanta.MsExchange.TYPE, ApplicationConstanta.MsExchange.STRING); subSource.put(ApplicationConstanta.MsExchange.VALUE, myMap); departmentPHSSuportEmail.put(ApplicationConstanta.EmailForwardString.SUB_SOURCE, subSource); System.out.println("JSON : " + JsonUtil.toJson(departmentPHSSuportEmail));
这样修改后,List里的三个元素都是独立的HashMap,各自保存自己的键值对,输出的JSON就会显示三个不同的对象了。
快速搞懂HashMap、List/ArrayList的核心区别
- HashMap:是键值对存储容器,键是唯一的,重复put同一个键会覆盖旧值。每个HashMap实例都是独立的对象,修改一个实例不会影响其他实例。
- List/ArrayList:是有序的元素集合,它存储的是对象的引用。如果多次添加同一个对象引用到List,List里的多个元素会指向同一个对象,修改这个对象会让所有对应元素都变化;只有添加不同的对象实例,才能保证每个元素独立。
简单总结:
要存多组独立的键值对,就得创建多个HashMap实例,再把它们逐个加到List里;千万别重复用同一个HashMap实例去存不同的键值组,不然最后一次修改会覆盖之前的内容,而且List里的元素全是同一个引用。
内容的提问来源于stack exchange,提问作者Albertus Bobby Setiawan
相关产品推荐
相关产品推荐

