首页 > 解决方案 > 尽管 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存在并且hashCodeandequals方法工作正常。但如果我跑

vertexIndexes.containsKey("Fischen")

它返回false

这是为什么?我对此失去了理智。

标签: javahashmap

解决方案


name.equals(vertexName)将 aVertex与 a进行比较String。虽然您的Vertexequals方法可能会true在您将 a 传递String给它时返回,但String'sequals将永远不会true在您将 a 传递Vertex给它时返回。

HashMap可能测试是否vertexName.equals(name)返回false

改变

vertexIndexes.containsKey("Fischen")

vertexIndexes.containsKey(new Vertex("Fischen"))

或将您的密钥更改MapString.

equals顺便说一句,如果您遵循出现在该类的 Javadoc 中的方法的约定,您本来可以避免该问题Object

• 它是对称的:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应该返回 true。

您的equals实现不是对称的。


推荐阅读