Гарантирует ли метод hashCode() уникальность объектов в Java?

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

Ответ

Нет, не гарантирует. hashCode() возвращает 32-битное целое число (int), что дает около 4.3 миллиарда возможных значений. Количество различных объектов, которые может создать программа, теоретически не ограничено, поэтому коллизии (разные объекты с одинаковым хеш-кодом) неизбежны.

Пример коллизии:

String s1 = "Aa";
String s2 = "BB";
System.out.println(s1.hashCode()); // 2112
System.out.println(s2.hashCode()); // 2112
System.out.println(s1.hashCode() == s2.hashCode()); // true
System.out.println(s1.equals(s2)); // false

Контракт между equals() и hashCode():

  1. Если equals() возвращает true для двух объектов, то их hashCode() обязаны быть одинаковыми.
  2. Обратное неверно: одинаковый hashCode() не означает, что equals() вернет true.

Цель hashCode() — обеспечить эффективное распределение объектов в хеш-таблицах (например, HashMap, HashSet), а не уникальную идентификацию.