Вы ошиблись. equals
просто возвращает логическое значение (два возможных значения) и нуждается в другом объекте для сравнения. hashCode
возвращает целое число (2 ^ 32 возможных значения) и требует только вызова объекта.
HashMap
пытается распределить все объекты, которые он содержит, между сегментами. Когда put
вызывается на карте, он должен решить, какое ведро он будет использовать для данного объекта. Таким образом, он использует hashCode
(по модулю количества сегментов), чтобы решить, какой сегмент использовать. Затем, когда корзина найдена, она должна проверить, есть ли ключ на карте или нет. Для этого он сравнивает каждый объект в корзине с объектом, помещаемым на карту. И для этого он использует equals
. Если объект не найден, он добавляет его в корзину.
hashCode
не используется, потому что он быстрее, чем equals
. Он используется потому, что позволяет распределять ключи по наборам. И гораздо быстрее вычислить hashCode один раз и сравнить объект с (надеюсь) 0, одним или двумя объектами в одном сегменте, чтобы сравнить объект с тысячами объектов, уже сохраненных на карте.