Следует ли переопределить метод "equals" (Object) при переопределении hashCode() в Java?

Следует ли переопределить метод equals (Object) при переопределении hashCode() в Java?

Я прочитал контракт, который переопределяет equals, вы должны переопределить hashCode. Действительно ли это верно?

Я думал о сценарии, где я не сравниваю объекты, нет метода equals.

Ответ 1

Да, это должно быть отменено. Если вы считаете, что вам нужно переопределить hashCode(), вам необходимо переопределить equals() и наоборот. Общий контракт hashCode():

  • Всякий раз, когда он вызывается на одном и том же объекте более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число, если информация, используемая при равных сравнениях с объектом, не изменяется. Это целое число не должно оставаться согласованным с одним исполнением приложения на другое выполнение того же приложения.

  • Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен давать одинаковый результат целого.

  • Не требуется, чтобы, если два объекта неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен производить различные целочисленные результаты. Тем не менее, программист должен знать, что создание отдельных целочисленных результатов для неравных объектов может улучшить производительность хэш-таблиц.

Ответ 2

Джошуа Блох разъясняет главу 3 своей "Эффективной Явы" - они должны быть заперты. Они всегда должны быть переопределены вместе.