Junior — Middle
Kodėl, pridedant vienodus objektus į HashSet, būtina perrašyti hashCode ir equals metodus?
sobes.tech AI
Atsakymas iš AI
Java HashSet naudoja maišos lentelę elementų saugojimui. Norint teisingai nustatyti, ar du objektai yra vienodi ir išvengti dubliavimosi, HashSet remiasi hashCode() ir equals() metodais.
hashCode()metodas apskaičiuoja objekto maišos kodą, kuris nurodo, į kurią "krepšelį" (bucket) jis bus įdėtas maišos lentelėje.equals()metodas lygina du objektus dėl jų lygybės.
Jei šių metodų nepakeisite savo klasėje, bus naudojama Object klasės implementacija, kuri lygina objektus pagal nuorodą (t.y., du skirtingi objektai su tais pačiais duomenimis bus laikomi skirtingais).
Todėl, kad HashSet teisingai atpažintų identiškus objektus ir neleistų dubliavimosi, būtina perrašyti hashCode() ir equals() taip, kad jie atsižvelgtų į svarbius objekto laukus.
Pavyzdys:
@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);
}
Be to, HashSet gali saugoti kelis objektus su tais pačiais duomenimis, kas pažeidžia rinkinio logiką.