java - HashMap 有 integer[] 类型的键,虽然它的 containsKey 方法返回 false?
问题描述
在hackerrank上解决问题时,我发现由于逻辑错误,我的输出与正确答案不同。我重新创建了逻辑错误以更好地解释这种情况。
HashMap<Integer[] , Integer> hm = new HashMap<>();
//both a and b have different hashcode
Integer[] a = {1, 1, 0, 0};
Integer[] b = {1, 1, 0, 0};
hm.put(a,1);
if (!hm.containsKey(b)) {
//key does not exists so, create new one
hm.put(b, 1);
}
else {
//key does exists so, put its value = value + 1
hm.put(b, hm.get(b)+1);
}
这里 hm.containsKey(b) 返回 false 但如果它返回 true 我的输出将匹配正确的输出。由于 a 和 b 的内容相等,如何使 containsKey(b) 返回 true?
解决方案
您不应该将数组用作 a 的键HashMap
,因为数组不会覆盖equals
and hashCode
,因此包含完全相同元素的不同数组实例不会被HashMap
.
改用List<Integer>
钥匙。
Map<List<Integer>, Integer> hm = new HashMap<>();
List<Integer> a = List.of(1, 1, 0, 0);
List<Integer> b = List.of(1, 1, 0, 0);
hm.put(a,1);
if (!hm.containsKey(b)) {
//key does not exists so, create new one
hm.put(b, 1);
}
else {
//key does exists so, put its value = value + 1
hm.put(b, hm.get(b)+1);
}
推荐阅读
- multithreading - QtConcurred 生成的线程具有与主线程相同的 ID
- javascript - 守望者抓取失败:未检测到更改
- mysql - 尝试通过 Spark 和 JDBC 连接 MySQL 数据库时出错
- scala - 'asInstanceOf[Class[_]]' 是什么意思
- angular - 在 Scala 后端转换从 Angular 收到的 TZ 日期
- javascript - 如何格式化图表中的数字
- file - svn:无法打开文件'/svn/**/db/transactions/59811-1a70.txn/changes':打开的文件太多(已解决)
- html - 弹性列的高度相等
- javascript - 在输入中键入清除文本时更新Vue组件
- c++ - 为 X Plane 11 SDK 设置代码块 (Linux Mint)