@hsadik

Контракт equals и hashCode?

Здравствуйте, понимаю, что этот вопрос довольно популярный и легко можно поискать в интернете, однако повстречал на разных источниках разную информацию, соответственно для меня как новичка, это вводит в ступор.
Вот как я понимаю примерно работу этих двух методов.

Чтобы сравнить объекты корректно, нам необходимо переопределить и equals, и hashCode, так как без переопределения будут использоваться реализации этих методов класса Object, что в большинстве случаев не годится.

Мы же хотим узнавать равны ли объекты, сравнивая поля объектов, например id. При добавлении двух объектов в качестве ключа в ту же HashMap сначала будет вызываться hashCode, так как вроде сделать простой математический расчет по формуле быстрее, чем сравнивать по equals (но это не точно).

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

Т.е. разные хэш-коды говорят о том, что объекты разные, а вот если хэш-коды совпадают, тогда дополнительно проверяем с помощью equals. Т.о. equals может выдавать false даже в том случае, если хеш-кодов совпадают.

Либо же сначала сравнивают через equals (как пишут во многих источниках)?
  • Вопрос задан
  • 1951 просмотр
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
так как вроде сделать простой математический расчет по формуле быстрее, чем сравнивать по equals (но это не точно)

Нет, выполнить хэширование не быстрее. Искать по хэшу быстрее, чем обходить всю коллекцию и выполнять equals с каждым элементом.

Либо же сначала сравнивают через equals (как пишут во многих источниках)?

Не читайте таких источников, они пишут чушь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы