HashMap containsKey() returns false although hashCode() and equals() are true

gut*_*uhu 7 java hashmap

I have a HashMap<Vertex, Integer> called vertexIndexes. If I iterate through it with this code:

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));  
    }
...
}
Run Code Online (Sandbox Code Playgroud)

it produces this output:

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
Run Code Online (Sandbox Code Playgroud)

So you can see, that the Vertex Fischen is present and the hashCode and equals methods work fine. But if I run

vertexIndexes.containsKey("Fischen")
Run Code Online (Sandbox Code Playgroud)

它返回false

这是为什么?我对此一无所知。

Era*_*ran 41

name.equals(vertexName)比较VertexString。当你的Vertexequals方法可能会返回true当你传递String给它,Stringequals将永远不会返回true,当你传递Vertex给它。

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

更改

vertexIndexes.containsKey("Fischen")
Run Code Online (Sandbox Code Playgroud)

vertexIndexes.containsKey(new Vertex("Fischen"))
Run Code Online (Sandbox Code Playgroud)

或将您的密钥更改MapString

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

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

您的equals实现不是对称的。