#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..., если я не ошибаюсь). Если разных объектов будет больше, чем этот предел, то физически нельзя сгенерировать разные хеши для всех объектов. Т.е., при использовании хешей можно увеличить производительность программы. Попробую объяснить правила: У одинаковых объектов всегда одинаковые хеши У одного и того же объекта всегда должен быть неизменяемый хешкод(если значения внутри объекта не изменились) У разных объектов иногда могут быть одинаковые хеши
Комментариев нет:
Отправить комментарий