首页 > 解决方案 > Java Hashmap containsKey 为现有键返回 false

问题描述

我的代码中有这个问题我试图找出问题的根源,它似乎很深,我无法弄清楚。我有一些非常重要的线索,但我觉得我的理解中缺少一些东西,所以我不知道如何解决它。

在我的代码中,我从具有 a 字段的对象的不同类调用构造函数,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

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

PS我希望代码足够清晰,因为要在此处添加大量代码以使整个程序运行起来。如果有必要,我会尝试编写一个新的、更清晰、更短的代码来演示这个问题,尽管我希望没有它也能解释它。

谢谢

标签: javahashmap

解决方案


数组不适合HashMaps 的键,因为数组不会覆盖equals()hashCode()Object

因此,具有完全相同元素的两个数组不被视为彼此相等HashMap

您可以使用List<Integer>而不是Integer[]作为您的键HashMap,因为Lists 确实会覆盖equals()hashCode()(也是如此Integer)。


推荐阅读