Java HashMap存入另一集合后清空原表致关联数据丢失问题咨询
问题原因解析
核心底层原理
Java 中所有非基本数据类型(包括 HashMap 等集合类)的变量存储的都是对象在堆内存中的引用地址,而非对象本身的拷贝。当你把一个对象存入另一个集合时,本质只是把它的引用地址存了进去,所有指向这个地址的变量,修改时都会同步影响其他引用读取到的结果。
对应你的代码问题
- 你将
hm_temp的实例化代码写在了for循环外部,整个程序运行期间只会创建唯一的一个hm_temp实例。 - 每次循环执行
hm2.put(s, hm_temp)时,都是把这个唯一实例的引用地址绑定到hm2的不同 key 上,也就是说hm2中所有 key 对应的 value,本质上都指向内存里的同一个 HashMap 对象。 - 你描述的“调用
hm1.clear()时hm2数据被清空”属于观察偏差:hm1.clear()本身只会清空hm1的内容,不会直接影响hm_temp。你看到的内容变更/清空,实际是下一轮循环调用hm_temp.putAll(hm1)时,直接修改了全局唯一的hm_temp实例的内容,自然同步影响了hm2中所有 key 关联的 value 取值。
修复方案
只需要把hm_temp的实例化移到for循环内部,每次循环创建一个全新的 HashMap 实例存入hm2,就不会出现内容互相影响的问题,修改后核心逻辑如下:
for(String s: strArray) { // 每次循环创建独立的临时HashMap实例 HashMap<Character, Integer> hm_temp = new HashMap<Character, Integer>(); System.out.println(hm1); char[] y = s.toCharArray(); for(Character ch: y) { if(hm1.containsKey(ch)) hm1.put(ch, hm1.get(ch)+1); else hm1.put(ch, 1); } System.out.println(hm1); hm_temp.putAll(hm1); System.out.println(hm_temp); hm2.put(s, hm_temp); System.out.println(hm2); hm1.clear(); }
内容的提问来源于stack exchange,提问作者Sreedhar Danturthi
相关产品推荐
相关产品推荐

