Контракт hashcode()
довольно прост:
Если два объекта равны по методу Equals, то вызов метода Hashcode на каждом из двух объектов должен производить тот же целочисленный результат.
Не требуется, чтобы, если два объекта неравны в соответствии с методом equals, то вызов метода hashCode для каждого из двух объектов должен производить различные целочисленные результаты.
Действительный хэш-функции для любого класса объектов может поэтому быть:
@Override
public int hashcode() {
return 42;
}
договора, равные объекты имеют одинаковое значение хэш-код выполняется.
Проблема заключается в том, что классы, использующие вышеупомянутый хэш-код для распространения объектов в ковши (например, HashSet
), будут распределять все объекты в одном и том же ковше с серьезными последствиями для производительности. Оптимальная хеш-функция, хотя и не строго обязательная, создавала бы различные значения для неравных объектов, чтобы они были распределены по собственным ведрам.
Контракт на Object.equals()
не требует использования hashcode()
при проведении сравнений. Однако, если неизменяемый объект имеет дорогостоящее сравнительное сравнение, он может использовать значение хэш-кода для определения необходимости дорогостоящего сравнения. Хэш-код можно кэшировать при первом вычислении.Поскольку объект неизменен, хэш-код не может меняться, и поэтому он может быть безопасно кэширован в экземпляре. Поэтому хэш-код можно использовать в качестве оптимизации для сравнений равных: дорогостоящее сравнение нужно делать только для экземпляров с одним и тем же хэш-кодом.
Простые алгоритмы для написания адекватных хэш-функций можно найти в Effective Java, 3rd Ed. (Дж. Блох). Современные IDE также могут автоматически генерировать хеш-функции для вас.
'equals' не использует' hashCode'. Хотя, у них есть контракт между собой, который должен быть соблюден. – CKing
равные объекты должны иметь одинаковый хэш-код, но не наоборот. –
Когда вы определяете equals или compareTo (когда вы переопределяете эти методы из класса Object), вы должны быть уверены, что два объекта, которые вы сравниваете, относятся к одному классу с примером instanceof(). a.equals (b) => a.hashCode() == b.hashCode(); Но a.hashCode() == b.hashCode! => A.equals (b); – Shondeslitch