HashSet
. HashMap
работает тем эффективнее, чем «лучше» распределение хэшей.Контракт:
1. Если объекты
equals
, у них должны быть одинаковые hashCode
(не обязательно наоборот – коллизии допустимы!)2.
equals
должен быть отношением эквивалентности3. Ничто не может быть
equals(null)
4.
equals
и hashCode
должны возвращать одни и те же значения для одного и того же объекта при каждом последующем вызове, даже если состояние объекта изменилось. Это делает реализацию для изменяемых (mutable) объектов крайне сложной. По умолчанию
equals
сравнивает на ==
. С умолчательным hashCode
дела обстоят интереснее: он зависит от реализации JVM, и может быть неожиданным. Например в OpenJDK 7 это случайное число. Подробная инструкция по переопределению этих методов описана в Effective Java Item 9 (больше деталей о волшебном числе 31 здесь).