Метод hashCode
используется для получения целочисленного хеш-кода объекта. Он необходим для правильной работы коллекций, основанных на хеш-таблицах, таких как HashMap
, HashSet
и HashTable
. При добавлении объекта в такую коллекцию, его хеш-код используется для определения "корзины" (bucket), куда будет помещен объект. При поиске объекта, хеш-код снова вычисляется для быстрого определения корзины, которую необходимо просмотреть.
Переопределение hashCode
необходимо, если вы переопределили метод equals
. Согласно контракту между equals
и hashCode
:
equals
, то их хеш-коды, возвращаемые методом hashCode
, должны быть одинаковыми.equals
, их хеш-коды, возвращаемые методом hashCode
, не обязаны быть разными, но для лучшей производительности коллекций желательно, чтобы они были различными.Если вы переопределите equals
без переопределения hashCode
, равные объекты будут иметь разные хеш-коды (за исключением случайных совпадений), что приведет к некорректной работе коллекций:
equals
, будут помещены в разные корзины.Для переопределения hashCode
обычно используется комбинация хеш-кодов полей объекта, которые участвуют в проверке равенства в методе equals
.
Наиболее распространенные способы переопределения:
Использование Objects.hash()
(с Java 7): Самый простой и рекомендуемый способ. Он безопасен для null
и использует хеш-коды предоставленных полей.
java
Метод hashCode
используется для получения целочисленного хеш-кода объекта. Он необходим для правильной работы коллекций, основанных на хеш-таблицах, таких как HashMap
, HashSet
и HashTable
. При добавлении объекта в такую коллекцию, его хеш-код используется для определения "корзины" (bucket), куда будет помещен объект. При поиске объекта, хеш-код снова вычисляется для быстрого определения корзины, которую необходимо просмотреть.
Переопределение hashCode
необходимо, если вы переопределили метод equals
. Согласно контракту между equals
и hashCode
:
equals
, то их хеш-коды, возвращаемые методом hashCode
, должны быть одинаковыми.equals
, их хеш-коды, возвращаемые методом hashCode
, не обязаны быть разными, но для лучшей производительности коллекций желательно, чтобы они были различными.Если вы переопределите equals
без переопределения hashCode
, равные объекты будут иметь разные хеш-коды (за исключением случайных совпадений), что приведет к некорректной работе коллекций:
equals
, будут помещены в разные корзины.Для переопределения hashCode
обычно используется комбинация хеш-кодов полей объекта, которые участвуют в проверке равенства в методе equals
.
Наиболее распространенные способы переопределения:
Использование Objects.hash()
(с Java 7): Самый простой и рекомендуемый способ. Он безопасен для null
и использует хеш-коды предоставленных полей.
java
Зарегистрируйтесь или войдите, чтобы получить доступ к полным ответам на все вопросы из банка вопросов.