Sobes.tech
Junior — Middle

De ce este necesar să suprascriem metodele hashCode și equals atunci când adăugăm obiecte identice într-un HashSet?

sobes.tech AI

Răspuns de la AI

HashSet în Java utilizează o tabelă hash pentru stocarea elementelor. Pentru a determina corect dacă două obiecte sunt identice și pentru a evita duplicatele, HashSet se bazează pe metodele hashCode() și equals().

  • Metoda hashCode() calculează codul hash al obiectului, care determină în ce "coș" (bucket) din tabelul hash va fi plasat.
  • Metoda equals() compară două obiecte pentru egalitate.

Dacă nu suprascrii aceste metode în clasa ta, se va folosi implementarea din clasa Object, care compară obiectele după referință (adică, două obiecte diferite cu aceleași date vor fi considerate diferite).

Prin urmare, pentru ca HashSet să recunoască corect obiectele identice și să nu permită duplicate, este necesar să suprascrii hashCode() și equals() astfel încât să țină cont de câmpurile importante ale obiectului.

Exemplu:

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

Fără acest lucru, HashSet poate stoca mai multe obiecte cu aceleași date, ceea ce încalcă logica mulțimii.