Junior — Middle
Proč je při přidávání stejných objektů do HashSet nutné přepsat metody hashCode a equals?
sobes.tech AI
Odpověď od AI
HashSet v Javě používá hash tabulku pro ukládání prvků. Aby bylo správně určeno, zda jsou dva objekty stejné a zabránilo se duplicitám, spoléhá HashSet na metody hashCode() a equals().
- Metoda
hashCode()vypočítá hash kód objektu, který určuje, do které "košíku" (bucketu) v hash tabulce bude zařazen. - Metoda
equals()porovnává dva objekty na rovnost.
Pokud tyto metody nepřepíšete ve své třídě, bude použita implementace z třídy Object, která porovnává objekty podle odkazu (tedy dva různé objekty se stejnými daty budou považovány za odlišné).
Proto je nutné přepsat hashCode() a equals() tak, aby braly v úvahu důležitá pole objektu.
Příklad:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyClass myClass = (MyClass) o;
return field1.equals(myClass.field1) && field2.equals(myClass.field2);
}
@Override
public int hashCode() {
return Objects.hash(field1, field2);
}
Bez toho může HashSet uchovávat několik objektů se stejnými daty, což narušuje logiku množiny.