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