Sobes.tech
Junior — Middle

Zašto je potrebno prepisati metode hashCode i equals prilikom dodavanja istih objekata u HashSet?

sobes.tech АИ

Одговор од АИ

HashSet u Javi koristi hash tabelu za skladištenje elemenata. Da bi pravilno odredio da li su dva objekta ista i da ne dodaje duplikate, HashSet se oslanja na metode hashCode() i equals().

  • Metoda hashCode() izračunava hash kod objekta, koji određuje u koju "korpu" (bucket) u hash tabeli će biti smešten.
  • Metoda equals() poredi dva objekta na jednakost.

Ako ne prepisujete ove metode u svojoj klasi, koristiće se implementacija iz klase Object, koja poredi objekte po referenci (tj. dva različita objekta sa istim podacima će se smatrati različitim).

Zato je potrebno prepisati hashCode() i equals() tako da uzimaju u obzir važne polja objekta.

Primer:

@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 ovoga, HashSet može da čuva više objekata sa istim podacima, što narušava logiku skupa.