Должен ли метод equals (Object) быть переопределен при переопределении hashCode() в Java?
Если equals
(Объект) метод будет переопределен при переопределении hashCode() в Java?
Я прочитал контракт, который переопределяет equals
, вы должны переопределить hashCode
, Верно ли наоборот?
Я думал о сценарии, где я не сравниваю объекты, нет равных.
2 ответа
Да, это должно быть отменено. Если вы думаете, что вам нужно переопределить hashCode()
тогда нужно переопределить equals()
и наоборот. Общий контракт hashCode():
Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число при условии, что никакая информация, используемая в сравнениях сравнения для объекта, не изменяется. Это целое число не должно оставаться согласованным от одного выполнения приложения к другому выполнению того же приложения.
Если два объекта равны в соответствии с методом equals(Object), то вызов метода hashCode для каждого из двух объектов должен привести к одному и тому же целочисленному результату.
Не требуется, чтобы, если два объекта были неравны в соответствии с методом equals(java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен приводить к разным целочисленным результатам. Тем не менее, программист должен знать, что выдача различных целочисленных результатов для неравных объектов может повысить производительность хеш-таблиц.
Джошуа Блох разъясняет это в главе 3 своей "Эффективной Явы" - они должны быть в шаге. Они всегда должны быть отменены вместе.