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
相关产品推荐
相关产品推荐

