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.