2010-03-18 4 views
3

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

+5

Вы можете хотя бы попробовать прочитать API - Javadoc для Object.hashcode() явно говорит: «Этот метод поддерживается в интересах хэш-таблиц, таких как java.util.Hashtable». –

ответ

12

Почему, по вашему мнению, избыточно? Они говорят разные вещи:

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

Вам определенно нужны оба - although I don't believe they should really be in Object in the first place.

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

+1

«Я не верю, что они действительно должны быть в объекте». Вы имеете в виду их обоих или просто hashCode()? equals() в качестве окончательного метода проверки идентичности (вероятно, названного по-другому, чтобы избежать путаницы) может показаться мне в нужном месте. equals() как виртуальный метод проверки равенства, похоже, не в том месте. –

+2

@Martinho: Оба. Идентификатор ссылки можно проверить с помощью == уже ... но большинство типов на самом деле не имеют понятия «равенства» или разумного хэша на основе их данных - так зачем рекламировать их для всех объектов? Сообщение в блоге имеет более подробную информацию, конечно :) –

+0

+1 @ Martinho, я полностью согласен. – Cam

1

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

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

+0

Вы также можете сравнить объекты с помощью hashcode – Neeraj

+2

@Neeraj: hashCode может иметь коллизии, т. Е. Объекты с одинаковым хэш-кодом, не всегда одинаковы. –

+0

Там это не для. Два совершенно разных объекта могут иметь один и тот же хэш-код. Представьте, что hashcode имеет максимальное значение 'Integer.MAX_VALUE', в то время как теоретически вы можете создать бесконечное количество различных объектов. – BalusC

2

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

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

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

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

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

+0

Кроме того, поскольку hashCode является int, он будет использоваться для ускорения поиска еще больше, действуя как индекс во что-то со случайным доступом. –

Смежные вопросы