嵌套HashMap结果不符合预期,代码逻辑是否存在错误?
问题分析与解决方案
嘿,这个问题我太熟了——你遇到的是Java里对象引用的经典坑!
从你描述的现象来看,核心问题是你在循环中重复复用了同一个HashMap对象(也就是你的hashMap2),并多次把它存入hashMap1中。
在Java这类面向对象语言里,集合存储的不是对象本身,而是指向对象的引用。所以你每次循环修改hashMap2的内容时,hashMap1里所有条目指向的都是同一个hashMap2实例——这就导致最后所有AAx对应的value全是最后一次修改后的hashMap2内容。
至于你调试时发现第二次循环还没执行put,hashMap1里的AA0就已经变成{A1=1},也是同样的道理:AA0对应的就是hashMap2这个对象的引用,你修改hashMap2时,这个引用指向的内容自然会同步变化,和你有没有执行新的put没关系。
快速解决方法
你需要在每次循环迭代时创建一个全新的HashMap实例,而不是一直用同一个对象。举个实际的代码例子:
HashMap<String, HashMap<String, Integer>> hashMap1 = new HashMap<>(); for (int i = 0; i < 5; i++) { // 关键:每次循环都新建一个hashMap2,不再复用之前的 HashMap<String, Integer> hashMap2 = new HashMap<>(); hashMap2.put("A" + i, i); hashMap1.put("AA" + i, hashMap2); }
这样每次存入hashMap1的都是独立的HashMap对象,它们的内容完全不会互相干扰,最终就能得到你期望的AA0={A0=0}, AA1={A1=1}, ..., AA4={A4=4}的结果。
额外小提示
如果之后你需要基于某个已有Map的内容创建新Map(而不是从头新建空Map),可以用拷贝构造器或者putAll方法生成副本,比如:
// 基于已有map创建独立的副本 HashMap<String, Integer> newMap = new HashMap<>(existingMap);
这也能避免不小心引用同一个对象的问题。
内容的提问来源于stack exchange,提问作者S_T
相关产品推荐
相关产品推荐

