Sobes.tech
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.