О взаимосвязи hashCode() и equals(). Правильно ли я ее понимаю?

97
08 октября 2021, 08:20

hashCode возвращает целочисленное int, которое характеризует объект. Грубо говоря, если у объекта есть два целочисленных поля, то мы должны как-то засунуть их в hashcode. Например, перемножить. Но засунуть нужно так, чтобы как можно меньшее количество других наборов переменных могло совпадать. И вот, у нас есть hashCode. Если объекты равны, то логично, что и hashCode'ы должны быть равны. Но если hashCode'ы равны, то объекты не обязательно должны быть равны, ведь мы не можем впихнуть все значения полей в одну переменную int, так?

Значит, если hashCode'ы равны, то шанс того, что объекты равны, очень сильно(зависит от того, как грамотно мы напишем алгоритм метода hashCode) повышается. А если они не равны, то объекты и вовсе не могут быть равны.

Мы знаем, что метод equals очень много жрет(так как сравнивает все поля объектов). Поэтому вместо использования equals для каждого сравнения мы сначала используем ОЧЕНЬ(относительно) дешевую операцию сравнения hashcode'ов объектов, которая ОЧЕНЬ повышает шанс того, что объекты равны. И только потом производим операцию сравнения equals, чтобы сказать точно об их идентичности.

Именно так и поступают коллекции HashMap, HashTable, HashSet.

Все ли так, как я написал?

READ ALSO
Изменение цвета иконки в Toolbar

Изменение цвета иконки в Toolbar

Есть Activity и несколько Fragment которые открываются внутри этого активитиToolbar находится в активити

108
java.io.StreamCorruptedException: invalid stream header: AC3F0005

java.io.StreamCorruptedException: invalid stream header: AC3F0005

я сериализую объект KeyEvent, превращаю его в строку, а затем сохраняю это значение в бд Oracle, затем читаю строку из бд и пытаюсь десериализовать...

103
Расширенный алгоритм Евклида

Расширенный алгоритм Евклида

Доброго времени суток

104
Data Jpa - операции с двумя аргументами

Data Jpa - операции с двумя аргументами

Приложение на Spring Data JpaИмеется класс Meal

98