作者:驰诗勋 | 来源:互联网 | 2022-11-03 12:16
如何解决《HashMapcontainsKey()returnsfalsealthoughhashCode()andequals()aretrue》经验,为你挑选了1个好方法。
I have a HashMap
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));
}
...
}
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
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")
它返回false
。
这是为什么?我对此一无所知。
1> Eran..:
name.equals(vertexName)
比较Vertex
到String
。当你的Vertex
类equals
方法可能会返回true
当你传递String
给它,String
的equals
将永远不会返回true
,当你传递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
实现不是对称的。