Какими факторами ограничена эффективность метода hashCode() в Java?

«Какими факторами ограничена эффективность метода hashCode() в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Эффективность hashCode() ограничена двумя ключевыми факторами:

  1. Диапазон возвращаемого значения: Метод возвращает int (32 бита), что дает около 4.3 миллиарда возможных значений. Для уникальной идентификации большего числа объектов этого недостаточно, что неизбежно приводит к коллизиям (разные объекты имеют одинаковый хеш).
  2. Качество реализации: Плохо написанный 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(...), который обеспечивает хорошее распределение.