簡體   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