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

Java HashMap的containsKey方法表现不符合预期,求助原因解析

Java HashMap的containsKey方法表现不符合预期,求助原因解析

嗨,这问题我刚一看也有点懵,不过捋清楚Java的自动装箱和HashMap的底层逻辑就明白啦!先还原下你的代码场景:

你最初写的代码是这样的:

public static void main(String[] args) {
    final byte key = 0;
    Map<Integer, Integer> test = new HashMap<>();
    test.put(0, 10);
    System.out.println(test.containsKey(key));
}

运行后输出的是false,但把key强转成int之后:

System.out.println(test.containsKey((int)key));

就输出true了,对吧?

核心原因其实在自动装箱的类型匹配和HashMap的equals比较逻辑上:

  • 首先,HashMap<Integer, Integer>的键是Integer类型,当你直接传byte类型的key给containsKey(Object o)方法时,Java会自动把这个byte装箱成Byte对象,而不是Integer对象。
  • 然后看Integer类的equals方法:它会先判断传入的对象是不是Integer的实例,如果不是,直接返回false。哪怕Byte对象的数值和Integer的数值一样,因为类型不同,equals也不成立。
  • 那为什么强转成int就可以呢?当你把byte强转成int后,自动装箱得到的是Integer对象,和HashMap里存的键是同一个类型了,这时候equals会比较两个Integer的数值,都是0,自然返回true,containsKey也就返回true了。

简单说就是:传Byte对象和Integer键比,类型不匹配直接不相等;传同类型的Integer对象(强转后装箱的),数值相同就符合条件啦!

备注:内容来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 10:32:59