Ответ
Эффективность hashCode() ограничена двумя ключевыми факторами:
- Диапазон возвращаемого значения: Метод возвращает
int(32 бита), что дает около 4.3 миллиарда возможных значений. Для уникальной идентификации большего числа объектов этого недостаточно, что неизбежно приводит к коллизиям (разные объекты имеют одинаковый хеш). - Качество реализации: Плохо написанный
hashCode()может генерировать хеши с плохим распределением, что сводит на нет преимущества хеш-коллекций (например,HashMap).
Пример плохой реализации (вызывает множество коллизий):
@Override
public int hashCode() {
return 1; // Все объекты этого класса будут иметь хеш 1.
}
// HashMap с такими объектами выродится в связный список.
Пример хорошей реализации (используется в классе String):
// Принцип: s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
// Использование простого числа 31 улучшает распределение.
Контракт hashCode() и equals():
- Если
a.equals(b) == true, тоa.hashCode() == b.hashCode()обязательно. - Обратное не обязательно: одинаковые хеши не гарантируют равенство объектов.
Рекомендация: Для генерации hashCode() используйте метод Objects.hash(...), который обеспечивает хорошее распределение.