Контракт методов hashCode и equals в Java определяет их взаимосвязь и гарантирует корректное поведение объектов при использовании коллекций, основанных на хеш-таблицах (например, HashSet, HashMap).
Основные правила контракта:
x, x.equals(x) должно возвращать true.x и y, x.equals(y) должно возвращать true тогда и только тогда, когда y.equals(x) возвращает true.x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то x.equals(z) должно возвращать true.x и y, многократный вызов x.equals(y) при неизменных объектах x и y всегда должен возвращать одно и то же значение.x, x.equals(null) должно возвращать false.И основное правило, связывающее hashCode и equals:
equals(Object), то вызов метода hashCode() для каждого из этих объектов должен производить одно и то же целое число.Значение контракта:
Нарушение контракта может привести к неправильной работе коллекций. Например, если два равных объекта возвращают разные хеш-коды, HashMap может поместить их в разные "корзины" (buckets) и не сможет найти один объект по другому, даже если они логически равны.
Пример корректной реализации:
java
Использование:
equals и hashCode) вместе.hashCode используйте те же поля, которые используются в equals.hashCode(). Для массивов используйте методы из Arrays.В Java 7+ для удобства и корректности рекомендуется использовать Objects.equals(Object a, Object b) и Objects.hash(Object... values).
Пример с Objects:
java