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

Java中两个HashMap的Integer值用==比较返回false问题求助

问题原因解答

核心问题和HashMap存储逻辑没有任何关联,触发原因是Java Integer包装类的缓存机制:

  • Java为了提升基础包装类的性能,内置了IntegerCache缓存池,默认会缓存**-128 ~ 127**区间的Integer对象:
    • 当自动装箱的整数落在该区间内时,会直接复用缓存池中的同一个对象,此时用==判断对象地址会返回正确结果
    • 当整数超出该区间时,每次自动装箱都会生成新的Integer对象,哪怕两个对象存储的数值完全一致,对象的内存地址也不相同,此时用==判断就会返回false

你遇到的场景刚好符合上述第二种情况:在最小覆盖子串的统计逻辑中,字符出现的次数很容易超过127,此时两个HashMap中取出的相同数值的Integer是不同对象,==判断自然返回false,改用equals()对比对象存储的数值,逻辑就会恢复正常。

验证示例

你可以用以下代码验证这个机制:

// 落在缓存区间内
Integer num1 = 127;
Integer num2 = 127;
System.out.println(num1 == num2); // 输出:true

// 超出缓存区间
Integer num3 = 128;
Integer num4 = 128;
System.out.println(num3 == num4); // 输出:false

替代解决方案

除了用equals()对比,你也可以先把Integer拆箱为int基本类型再用==判断,注意使用前要先判空避免空指针异常:

// 判空后拆箱对比
if (smap.get('a') != null && tmap.get('a') != null 
    && smap.get('a').intValue() == tmap.get('a').intValue()) {
    // 执行逻辑
}

内容的提问来源于stack exchange,提问作者Ivan Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:15:00