💡 Java: переопределяешь equals() - переопредели и hashCode()
Два объекта с одинаковым email могут быть равны по equals(), но HashSet.contains() при этом вернёт false.
Причина: HashSet и HashMap сначала используют хеш, чтобы определить, где искать объект, а затем проверяют равенство. Если хеши различаются, до equals() дело может не дойти.
Правило: равные объекты обязаны иметь одинаковый hashCode(). При этом одинаковый хеш не гарантирует равенство - коллизии допустимы.
В примере на картинке равенство определяется по email, поэтому хеш тоже вычисляется по нему.
И ещё: не меняйте поля, участвующие в equals() и hashCode(), пока объект хранится в HashSet или используется как ключ HashMap - поиск может перестать его находить.
#Java #OOP
Два объекта с одинаковым email могут быть равны по equals(), но HashSet.contains() при этом вернёт false.
Причина: HashSet и HashMap сначала используют хеш, чтобы определить, где искать объект, а затем проверяют равенство. Если хеши различаются, до equals() дело может не дойти.
Правило: равные объекты обязаны иметь одинаковый hashCode(). При этом одинаковый хеш не гарантирует равенство - коллизии допустимы.
В примере на картинке равенство определяется по email, поэтому хеш тоже вычисляется по нему.
И ещё: не меняйте поля, участвующие в equals() и hashCode(), пока объект хранится в HashSet или используется как ключ HashMap - поиск может перестать его находить.
#Java #OOP