Может ли число 1 (Integer) быть ключом в HashMap, учитывая его иммутабельность?

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

Ответ

Да, может и это идеальный кандидат для ключа. Класс Integer является иммутабельным (неизменяемым), что является ключевым требованием для объектов-ключей в HashMap.

Почему иммутабельность важна:

  1. Стабильность хэш-кода: Позиция записи в HashMap определяется хэш-кодом ключа на момент вставки. Если ключ изменится после добавления, его хэш-код может стать другим, и запись станет невозможно найти (она останется в «старой» корзине).
  2. Integer гарантирует, что его значение и, следовательно, hashCode() никогда не изменятся после создания.

Пример безопасного использования:

HashMap<Integer, String> map = new HashMap<>();
Integer key = 1;
map.put(key, "One");

System.out.println(map.get(1)); // Выведет: "One"
System.out.println(map.get(key)); // Выведет: "One"
// key = 2; // Невозможно! Integer иммутабелен. Можно только создать новый объект.

Контракт для кастомных ключей: Если вы создаете свой класс для ключа, вы должны:

  • Сделать его иммутабельным (поля final, нет сеттеров).
  • Корректно переопределить equals(Object o).
  • Корректно переопределить hashCode() (так, чтобы для равных объектов возвращался одинаковый хэш).

Использование иммутабельных ключей, таких как Integer, String или LocalDate, предотвращает тонкие ошибки в работе HashMap.