Java Hashmap containsKey为现有密钥返回false

时间:2020-06-14 12:28:14

标签: java hashmap

我的代码中有这个问题,我试图找出问题的根源,这似乎很深,我无法解决。我有一些非常重要的线索,但是我感觉我的理解中缺少一些东西,因此我不知道该如何解决。

在我的代码中,我从具有Hashmap<Integer[], Integer[]>字段的对象的不同类中调用构造函数,并且在调试时,我看到映射确实包含我要查找的键。这里的map包含一个将数组{0}映射到数组{0}的映射:

Integer[] key = {0};
boolean contains = obj.map.containsKey(key); // is false in the debugger

尽管如果我初始化一个新的Hashmap,它的行为也会有所不同:

Hashmap<Integer[], Integer[]> map = new Hashmap();
Integer[] key = {0};
Integer[] val = {0};
map.put(key,val);
boolean contains = map.containsKey(key); // is true in the debugger

我看到这两种情况之间有一个明显的区别,在第二种情况下,变量“键”和Hashmap中的实际键是同一对象,尽管在第一种情况下它们不是同一对象。我想这就是造成差异的原因。但是我似乎无法理解如何控制键始终是地图中的同一对象,或者如何实现该键以便始终找到键。我会使用int而不是Integer,但是在Hashmap中不允许这样做,那么在这种情况下正确的工作流程应该如何?

P.S我希望代码足够清晰,因为要在其中添加代码以使整个程序运行起来,需要编写大量的代码。如果有必要,我将尝试编写一个新的,更清晰和简短的代码来演示该问题,尽管我希望可以在没有该问题的情况下进行解释。

谢谢

1 个答案:

答案 0 :(得分:8)

数组不适用于HashMap,因为数组不会覆盖equals()类的hashCode()Object

结果是,HashMap认为元素完全相同的两个数组彼此相等。

您可以使用List<Integer>代替Integer[]作为HashMap的密钥,因为List确实会覆盖equals()hashCode()Integer也是如此。

相关问题