Можно ли реализовать метод hashCode(), который всегда возвращает одно и то же число?

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

Ответ

Технически можно, но это считается серьезным антипаттерном для большинства случаев, так как нарушает эффективность работы hash-коллекций (HashMap, HashSet, ConcurrentHashMap).

Проблемы:

  1. Вырождение производительности: Все объекты будут иметь один хеш-код и попадать в один бакет (bucket). Коллекция вырождается в связный список, и операции get(), put() деградируют с O(1) до O(n).
  2. Контракт equals-hashCode: Он не нарушается, если реализация equals также считает все объекты равными. Контракт требует: если equals() возвращает true, то hashCode() должен быть одинаковым. Обратное не требуется.

Допустимые (но редкие) случаи использования:

  • Класс-синглтон, где существует только один экземпляр.
  • Неизменяемый (immutable) класс, все экземпляры которого логически равны.
  • Когда производительность не важна, а объекты используются крайне редко.

Пример (антипаттерн):

@Override
public int hashCode() {
    return 1; // Все объекты этого класса будут иметь один хеш-код.
}

Вывод: Избегайте этого подхода. Используйте стандартные алгоритмы (например, Objects.hash()) для генерации хорошего, распределенного хеш-кода.