Должен ли метод equals (Object) быть переопределен при переопределении hashCode() в Java?

Если equals (Объект) метод будет переопределен при переопределении hashCode() в Java?

Я прочитал контракт, который переопределяет equals, вы должны переопределить hashCode, Верно ли наоборот?

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

2 ответа

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

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

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

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

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

Другие вопросы по тегам