Контракт методов 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
Контракт методов 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
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.