Страницы

Поиск по вопросам

среда, 26 февраля 2020 г.

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

#java #hashcode


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

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



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



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



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


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



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


Ответы

Ответ 1



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

Комментариев нет:

Отправить комментарий