You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:25:07