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

