Метод hashCode используется для получения целочисленного хеш-кода объекта. Он необходим для правильной работы коллекций, основанных на хеш-таблицах, таких как HashMap, HashSet и HashTable. При добавлении объекта в такую коллекцию, его хеш-код используется для определения "корзины" (bucket), куда будет помещен объект. При поиске объекта, хеш-код снова вычисляется для быстрого определения корзины, которую необходимо просмотреть.
Переопределение hashCode необходимо, если вы переопределили метод equals. Согласно контракту между equals и hashCode:
equals, то их хеш-коды, возвращаемые методом hashCode, должны быть одинаковыми.equals, их хеш-коды, возвращаемые методом hashCode, не обязаны быть разными, но для лучшей производительности коллекций желательно, чтобы они были различными.Если вы переопределите equals без переопределения hashCode, равные объекты будут иметь разные хеш-коды (за исключением случайных совпадений), что приведет к некорректной работе коллекций:
equals, будут помещены в разные корзины.Для переопределения hashCode обычно используется комбинация хеш-кодов полей объекта, которые участвуют в проверке равенства в методе equals.
Наиболее распространенные способы переопределения:
Использование Objects.hash() (с Java 7): Самый простой и рекомендуемый способ. Он безопасен для null и использует хеш-коды предоставленных полей.
java
Вручную (с использованием простого алгоритма): Более низкоуровневый подход, который может быть полезен для понимания, но более подвержен ошибкам. Обычно используется простое умножение и сложение.
java
Стандартное нечетное простое число (31) используется, потому что умножение на 31 может быть оптимизировано компилятором (31 * i == (i << 5) - i).
Использование IDE: Большинство современных IDE (IntelliJ IDEA, Eclipse) имеют функции для автоматической генерации методов equals() и hashCode(). Это самый безопасный и рекомендуемый подход, так как они генерируют код в соответствии с лучшими практиками.
Главная цель переопределения hashCode — гарантировать, что равные объекты имеют одинаковые хеш-коды, что критически важно для корректной работы коллекций, основанных на хешировании.