java - 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我希望代码足够清晰,因为要在此处添加大量代码以使整个程序运行起来。如果有必要,我会尝试编写一个新的、更清晰、更短的代码来演示这个问题,尽管我希望没有它也能解释它。
谢谢
解决方案
数组不适合HashMap
s 的键,因为数组不会覆盖equals()
和hashCode()
类Object
。
因此,具有完全相同元素的两个数组不被视为彼此相等HashMap
。
您可以使用List<Integer>
而不是Integer[]
作为您的键HashMap
,因为List
s 确实会覆盖equals()
和hashCode()
(也是如此Integer
)。
推荐阅读
- python - 卡在字典中显示值
- typescript - 打字稿声明文件不遵循它自己的导入
- javascript - 使用 Java 和 NodeJS 验证字符串
- java - 无法解析符号“项目”
- c - 从前面的对象可以看到opengl后面的对象
- firebase - 未来
返回一个未来 而不是 UserData 变量 - node.js - expo publish 总是以 Ubuntu 上的 Javascript head out of memory 结束
- pytorch - 我们可以在 Pytorch DataLoader 中的工作人员之间共享内存吗?
- java - 如何忽略正则表达式中的正/负后瞻/前瞻组?
- javascript - 如何将日期传递给我的 addEventListener 函数?