Ответ 1
Вам нужно реализовать hashCode()
и equals()
. compareTo()
дополнительно требуется для отсортированного отображения/набора.
Подробнее см. этот вопрос.
У меня есть класс, который я хочу настроить как ключи в HashMap. Я уже реализовал метод compareTo для этого класса. Но все же, когда я это делаю:
map.put(new MyKey(dummyArguements) , dummyValue ); System.out.println(map.get( new MyKey(dummyArguements) ) );
Я получаю null. Таким образом, hashmap не может идентифицировать, что эти два ключа (для вызова get и put) одинаковы.
Может ли кто-нибудь помочь мне здесь, пожалуйста?
Вам нужно реализовать hashCode()
и equals()
. compareTo()
дополнительно требуется для отсортированного отображения/набора.
Подробнее см. этот вопрос.
Вы должны реализовать equals()
и hashCode()
. Ваш класс также должен быть неизменным. Если он изменен, его хэш-код может измениться после добавления его в карту. Тогда на карте могут возникнуть проблемы с ее поиском.
1) В целом для коллекций вы хотите переопределить метод equals() (а также метод hashcode()) для вашего класса. compareTo()/Comparable и Comparator обычно используются для сортировки и вместо этого используют метод equals() для эквивалентности объекта в некоторых случаях - примерами являются разработчики SortedSet, такие как TreeSet.
2) Пожалуйста, соблюдайте стандарты именования Java в своем коде. Названия ваших классов должны быть заглавными... например new MyKey(dummyArguments)
. См. http://www.oracle.com/technetwork/java/codeconventions-135099.html#367 (и http://www.oracle.com/technetwork/java/codeconvtoc-136057.html) для более подробной информации.
У вас есть hashCode()
? compareTo
необходим для сортировки.
HashMap
не проверяет compareTo()
;
HashMap
проверяет hashCode()
и equals()
.
При использовании Коллекций, которые полагаются на хеширование, такие как Map и Set, вы должны реализовать equals()
и hashCode()
, чтобы гарантировать правильную функциональность. Если у вас нет нового myKey, он всегда будет отличаться от ключа, сохраненного на карте, потому что он использует стандартные версии equals()
и hashCode()
.
Вы должны реализовать equals() и hashCode(). Ваш класс также должен быть неизменным. Если он изменен, его хэш-код может измениться после добавления его в карту. Тогда на карте могут возникнуть проблемы с ее поиском.
Как и в java8, вы также должны реализовать Comparable (добавление compareTo), потому что, если количество хашевых столкновений превышает 11, HashMap сохраняет записи в двоичном дереве. Если вы этого не сделаете, производительность страдает