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)比较Vertex到String。当你的Vertex类equals方法可能会返回true当你传递String给它,String的equals将永远不会返回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)
或将您的密钥更改Map为String。
顺便说一句,如果您遵循该类equals的Javadoc中出现的方法的约定,那么您本来可以避免该问题的发生Object:
•它是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
您的equals实现不是对称的。
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |