java - 尽管 hashCode() 和 equals() 为真,但 HashMap containsKey() 返回假
问题描述
我有一个HashMap<Vertex, Integer>
叫vertexIndexes
. 如果我用这段代码遍历它:
public boolean search(String vertexName){
for (Vertex name: vertexIndexes.keySet()){
String key = name.toString();
String value = vertexIndexes.get(name).toString();
System.out.println(key + " " + value + " "+ (name.hashCode() == vertexName.hashCode()) + " " + name.equals(vertexName));
}
...
}
它产生这个输出:
Diessen 0 false false
Herrsching 5 false false
Schondorf 2 false false
Greifenberg 3 false false
Stegen 4 false false
Utting 1 false false
Andechs 6 false false
Fischen 7 true true
所以你可以看到, VertexFischen
存在并且hashCode
andequals
方法工作正常。但如果我跑
vertexIndexes.containsKey("Fischen")
它返回false
。
这是为什么?我对此失去了理智。
解决方案
name.equals(vertexName)
将 aVertex
与 a进行比较String
。虽然您的Vertex
类equals
方法可能会true
在您将 a 传递String
给它时返回,但String
'sequals
将永远不会true
在您将 a 传递Vertex
给它时返回。
HashMap
可能测试是否vertexName.equals(name)
返回false
。
改变
vertexIndexes.containsKey("Fischen")
到
vertexIndexes.containsKey(new Vertex("Fischen"))
或将您的密钥更改Map
为String
.
equals
顺便说一句,如果您遵循出现在该类的 Javadoc 中的方法的约定,您本来可以避免该问题Object
:
• 它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。
您的equals
实现不是对称的。
推荐阅读
- php - 当 WooCommerce 中的特定订单项元为空时发送自定义电子邮件
- c# - 运行 POST 方法 WEPAPI 时出错
- python-3.x - 从 pandas 数据框创建字典
- java - 如何检索editText值并将其添加到列表中
? - spring-webflux - 控制器是否应该将集合包装到 Flux 中?
- sql - Postgresql 在大数据集上的 OVERLAPS 性能
- spring-boot - Spring Security/Spring Data Repository - 如何保护所有方法,具体取决于主体与 user_id 列匹配?
- excel - Excel 更改事件
- r - equivalent of hoverEdge for clicks in in Shiny for visNetwork
- python - Filtering what gets displayed on graph (Sypder (Python 3.7)