Ответ
Нет, не гарантирует. 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():
- Если
equals()возвращаетtrueдля двух объектов, то ихhashCode()обязаны быть одинаковыми. - Обратное неверно: одинаковый
hashCode()не означает, чтоequals()вернетtrue.
Цель hashCode() — обеспечить эффективное распределение объектов в хеш-таблицах (например, HashMap, HashSet), а не уникальную идентификацию.