HashMap containsKey () возвращает false, хотя hashCode () и equals () имеют значение true - PullRequest
7 голосов
/ 26 марта 2019

У меня есть 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

Итак, вы можете видеть, что вершина Fischen присутствует и методы hashCode и equals работают нормально. Но если я бегу

vertexIndexes.containsKey("Fischen")

возвращает false.

Почему это? Я схожу с ума по этому поводу.

1 Ответ

41 голосов
/ 26 марта 2019

name.equals(vertexName) сравнивает Vertex с String.Хотя ваш Vertex class 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 class:

• Симметрично: для любых ненулевых ссылочных значений x и y x.equals (y) должен возвращать true, если и только если y.equals (x) возвращает true.

Ваша реализация equals не симметрична.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...