Sobes.tech
Junior — Middle

Prečo je potrebné prepisovať metódy hashCode a equals pri pridávaní rovnakých objektov do HashSet?

sobes.tech AI

Odpoveď od AI

HashSet v Jave používa hash tabuľku na ukladanie prvkov. Aby správne určil, či sú dva objekty rovnaké a zabránil duplikátom, HashSet sa spolieha na metódy hashCode() a equals().

  • Metóda hashCode() vypočíta hash kód objektu, ktorý určuje, do ktorej "košíka" (bucketu) v hash tabuľke bude umiestnený.
  • Metóda equals() porovnáva dva objekty na rovnosť.

Ak tieto metódy nepíšete prepísané vo svojej triede, bude použitá implementácia z triedy Object, ktorá porovnáva objekty podľa odkazu (t.j. dva rôzne objekty s rovnakými dátami budú považované za odlišné).

Preto je potrebné prepísať hashCode() a equals() tak, aby brali do úvahy dôležité polia objektu.

Prí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 uložiť viacero objektov s rovnakými dátami, čo narúša logiku množiny.