Установка собственного класса в качестве ключа в Java Hashmap - PullRequest
14 голосов
/ 08 сентября 2010

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

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

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

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

Ответы [ 8 ]

34 голосов
/ 08 сентября 2010

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

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

13 голосов
/ 08 сентября 2010

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

3 голосов
/ 08 сентября 2010

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).

0 голосов
/ 04 ноября 2016

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

0 голосов
/ 08 сентября 2010

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

0 голосов
/ 08 сентября 2010

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

0 голосов
/ 08 сентября 2010

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

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

0 голосов
/ 08 сентября 2010

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

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