繁体   English   中英

尽管hashCode()和equals()为true,但HashMap containsKey()返回false

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

我有一个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

因此,您可以看到存在Vertex Fischen ,并且hashCodeequals方法可以正常工作。 但是如果我跑步

vertexIndexes.containsKey("Fischen")

它返回false

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

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

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

更改

vertexIndexes.containsKey("Fischen")

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

或将Map的键更改为String

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

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

您的equals实现不是对称的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM