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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:09:04