Почему одинаковый хэш-код может быть у разных объектов?

125
09 декабря 2020, 16:50

Хотел спросить:

И так же, как для equals(), для метода hashCode() есть официальные требования, прописанные в документации Oracle:

  1. Если два объекта равны (т.е. метод equals() возвращает true), у них должен быть одинаковый хэш-код.

Иначе наши методы будут лишены смысла. Проверка по hashCode(), как мы и сказали, должна идти первой для повышения быстродействия. Если хэш-коды будут разными, проверка вернет false, хотя объекты на самом деле равны (согласно нашему определению в методе equals()).

  1. Если метод hashCode() вызывается несколько раз на одном и том же объекте, каждый раз он должен возвращать одно и то же число.

  2. Правило 1 не работает в обратную сторону. Одинаковый хэш-код может быть у двух разных объектов.

Я запутался помогите разобраться:
Почему в 3 правило написано мол правило 1 не работает в обратную сторону?
Получается 1 правило 2 объекта равны и у них хэш-код одинаковый.
А 3 правило так же одинаковый хэш-код у 2 объектов или я не очень понимаю? Почему в 1 правило написано если 2 объекта равны, а в 3 правило написано одинаковый хэш-код может быть у двух РАЗНЫХ объектов, как понять разных?

Answer 1

Примечание: предполагается, что в классе переопределен метод hashCode().

По хорошему, у разных объектов хешкод должен быть разный. Но на практике иногда происходит по другому. Очень часто это происходит из-за несовершенства формулы для вычисления хешкода.

Пример: хеш строки считается по длине строки: length*3. Тогда у строк foo и bar одинаковые хеши.

Вообще, хешкод используется для того, чтобы можно было точно сказать, что объекты разные. Но не для того, чтобы сказать, что они одинаковые. Одинаковый хешкод - не гарантия одинаковых объектов.

Обычно он используется для сравнения объектов:
Допустим, у вас есть объект, в котором есть много-много полей. В большинстве случаев объекты для сравнения будут неравны. Чтобы не сравнивать кучу переменных(если объекты не равны), можно сначала сравнивать хешкод(т.к., если хеш различается, то объекты точно различны). Если хеши отличаются - можно дальше не сравнивать переменные. Если одинаковы - дальше нужно сравнить переменные(т.к., если хеши одинаковы, то это не значит, что объекты одинаковы).

Ну и последнее - почти всегда возвращаемый тип метода hashCode() - int. У int есть определенный предел(от -21... до +21..., если я не ошибаюсь). Если разных объектов будет больше, чем этот предел, то физически нельзя сгенерировать разные хеши для всех объектов. Т.е., при использовании хешей можно увеличить производительность программы.

Попробую объяснить правила:

  • У одинаковых объектов всегда одинаковые хеши
  • У одного и того же объекта всегда должен быть неизменяемый хешкод(если значения внутри объекта не изменились)
  • У разных объектов иногда могут быть одинаковые хеши
READ ALSO
Проблема с button JAVA (android Studio)

Проблема с button JAVA (android Studio)

Всем приветРешил сделать простенькое приложение для "изучения" английского

133
Не рисуется квадрат в path на java в canvas [закрыт]

Не рисуется квадрат в path на java в canvas [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

113
Как передать js функцию на другую вкладку

Как передать js функцию на другую вкладку

хотел узнать как реализовать передачу js функции из консоли одной вкладки, в консоль другой вкладки, как-нибудь это реализуемо? Решил сделать...

134
Как вывести результат в div с классом в jquery через функцию tofixed()

Как вывести результат в div с классом в jquery через функцию tofixed()

У меня есть курс валют к ним нужно применить tofixed что бы было так 6542 руб а не такой результат 65

112