我有一个名为HashMap<Vertex, Integer>
的{{1}}。如果我使用以下代码进行遍历:
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
,并且Fischen
和hashCode
方法可以正常工作。但是如果我跑步
equals
它返回vertexIndexes.containsKey("Fischen")
。
那是为什么?我对此一无所知。
答案 0 :(得分:41)
name.equals(vertexName)
将Vertex
与String
进行比较。当您将Vertex
传递给equals
类true
的方法时,String
的{{1}}将永远不会返回{{ 1}},当您将String
传递给它时。
equals
可能会测试true
是否返回Vertex
。
更改
HashMap
到
vertexName.equals(name)
或将您的false
的密钥更改为vertexIndexes.containsKey("Fischen")
。
顺便说一句,如果您遵循vertexIndexes.containsKey(new Vertex("Fischen"))
类的Javadoc中出现的Map
方法的约定,则可以避免该问题的发生:
•这是对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才应返回true。
您的String
实现不对称。