Подтвердить что ты не робот

Установка собственного класса в качестве ключа в java Hashmap

У меня есть класс, который я хочу настроить как ключи в HashMap. Я уже реализовал метод compareTo для этого класса. Но все же, когда я это делаю:

map.put(new MyKey(dummyArguements) , dummyValue );
System.out.println(map.get( new MyKey(dummyArguements) ) );

Я получаю null. Таким образом, hashmap не может идентифицировать, что эти два ключа (для вызова get и put) одинаковы.

Может ли кто-нибудь помочь мне здесь, пожалуйста?

4b9b3361

Ответ 1

Вам нужно реализовать hashCode() и equals(). compareTo() дополнительно требуется для отсортированного отображения/набора.

Подробнее см. этот вопрос.

Ответ 2

Вы должны реализовать equals() и hashCode(). Ваш класс также должен быть неизменным. Если он изменен, его хэш-код может измениться после добавления его в карту. Тогда на карте могут возникнуть проблемы с ее поиском.

Ответ 3

1) В целом для коллекций вы хотите переопределить метод equals() (а также метод hashcode()) для вашего класса. compareTo()/Comparable и Comparator обычно используются для сортировки и вместо этого используют метод equals() для эквивалентности объекта в некоторых случаях - примерами являются разработчики SortedSet, такие как TreeSet.

2) Пожалуйста, соблюдайте стандарты именования Java в своем коде. Названия ваших классов должны быть заглавными... например new MyKey(dummyArguments). См. http://www.oracle.com/technetwork/java/codeconventions-135099.html#367http://www.oracle.com/technetwork/java/codeconvtoc-136057.html) для более подробной информации.

Ответ 4

У вас есть hashCode()? compareTo необходим для сортировки.

Ответ 5

HashMap не проверяет compareTo();

HashMap проверяет hashCode() и equals().

Ответ 6

При использовании Коллекций, которые полагаются на хеширование, такие как Map и Set, вы должны реализовать equals() и hashCode(), чтобы гарантировать правильную функциональность. Если у вас нет нового myKey, он всегда будет отличаться от ключа, сохраненного на карте, потому что он использует стандартные версии equals() и hashCode().

Ответ 7

Вы должны реализовать equals() и hashCode(). Ваш класс также должен быть неизменным. Если он изменен, его хэш-код может измениться после добавления его в карту. Тогда на карте могут возникнуть проблемы с ее поиском.

Ответ 8

Как и в java8, вы также должны реализовать Comparable (добавление compareTo), потому что, если количество хашевых столкновений превышает 11, HashMap сохраняет записи в двоичном дереве. Если вы этого не сделаете, производительность страдает