Почему существуют hashCode () и equals () - PullRequest
3 голосов
/ 18 марта 2010

почему у класса Java-объекта есть два метода hashcode () и equals ()? Один из них выглядит избыточным, и его перколнируют к самому низшему производному классу?

Ответы [ 4 ]

12 голосов
/ 18 марта 2010

Почему вы думаете, что один лишний? Они говорят разные вещи:

  • hashCode - это «дайте мне какой-нибудь способ эффективно определить, являются ли два объекта вероятными равными»
  • equals - это «проверить, действительно ли этот объект равен другому»

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

Вам абсолютно необходимы хеш-коды для эффективного поиска с помощью хеш-таблиц - и вам абсолютно необходимы дальнейшие проверки на равенство, потому что хэши будут сталкиваться (например, строк гораздо больше, чем хеш-кодов).

2 голосов
/ 18 марта 2010

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

2 голосов
/ 18 марта 2010

Прежде всего, когда вы переопределяете equals (), вы ДОЛЖНЫ также переопределять hashcode ().

Неспособность сделать это приведет к нарушению общего контракта для Object.hashCode, который будет препятствуйте тому, чтобы ваш класс функционировал должным образом в сочетании со всеми основанными на хэше коллекции, включая HashMap, HashSet и Hashtable.

Вот контракт, скопированный из спецификации объекта [JavaSE6]:

  • Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения, метод hashCode должен последовательно возвращать то же самое целое, при условии, что информация не используется в сравнениях на объект изменен Это целое число не должно оставаться последовательным из одного Направление приложения на другое исполнение того же приложения.
  • Если два объекта равны по методу equals (Object), то вызов Использование метода hashCode для каждого из двух объектов должно привести к целочисленный результат.
  • Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals (Object), то вызывать метод hashCode для каждого из двух объектов должен давать разные целочисленные результаты. Тем не менее, программист должен быть осознавая, что получение различных целочисленных результатов для неравных объектов может улучшить производительность хеш-таблиц.
1 голос
/ 18 марта 2010

равно для сравнения объектов, хеш-код используется для генерации хеш-значения из объекта, который затем будет использоваться контейнерами карты Java (Hashtable, Map и т. Д.).

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

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