Sobes.tech
Junior — Middle

Miks on vajalik üle kirjutada meetodid hashCode ja equals, kui lisame HashSet-i sarnased objektid?

sobes.tech AI

Vastus AI-lt

Java-s kasutab HashSet elementide salvestamiseks hajupõhist tabelit. Õige objekti võrdlemiseks ja duplikaatide vältimiseks tugineb HashSet meetoditele hashCode() ja equals().

  • hashCode() meetod arvutab objekti hajukoha koodi, mis määrab, millisesse "ämbrisse" (bucket) see tabelis paigutatakse.
  • equals() meetod võrdleb kahte objekti nende võrdvuse osas.

Kui te ei ülekirjuta neid meetodeid oma klassis, kasutatakse Object klassi rakendust, mis võrdleb objekte viitamise põhjal (st. kaks erinevat objekti, millel on samad andmed, loetakse erinevateks).

Seetõttu on vajalik üle kirjutada hashCode() ja equals() nii, et need arvestaksid objekti olulisi välju.

Näide:

@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);
}

Ilma selleta võib HashSet salvestada mitu objekti sama andmetega, mis rikub kogumi loogikat.