Особенности HashSet

компьютеры Компьютеры программирование java

Как я понял, порядок элементов (и место их расположения) в HashSet определяется с помощью hashCode(). Если мы предполагаем, что контрольная сумма считается криво, хэш у элементов может совпасть , даже если compareTo не даёт равенства. Возможно ли ложное срабатывание равенства при добавлении элемента? И если да, то что лучше исполтзовать?
Ответы:
> что контрольная сумма считается криво, хэш у элементов может совпасть ,
> даже если compareTo не даёт равенства
Есть такое понятие, как коллизия - это когда у двух разных объектов одинаковый hash. Это происходит из-за несовершенства большинства hash функций. Поэтому, дополнительно к сравнению хэшей всегда производится сравнение объектов, путем вызова у них метода equals (заметьте, compareTo вообще никак здесь не используется).
Например, у нас есть два объекта obj1 и obj2 - это разные объекты, но из за коллизии их хэши совпали. После этого вызывается метод equals, который возвращает false (т.к. объекты то разные). В ситуации кода хэши одинаковые, а equalse возвращает false, считается что произошла коллизия. И используя специальный алгоритм разрешения коллизий - obj1 и obj2 добавляются в HashSet. Т.е. кривая реализация hashCode(), в том случае, который вы описали выше, будет принята за коллизию.


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.