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

时间:2019-03-26 10:01:16

标签: java hashmap

我有一个名为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 ,并且FischenhashCode方法可以正常工作。但是如果我跑步

equals

它返回vertexIndexes.containsKey("Fischen")

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

1 个答案:

答案 0 :(得分:41)

name.equals(vertexName)VertexString进行比较。当您将Vertex传递给equalstrue的方法时,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实现不对称。