Sobes.tech
Junior

Ce face metoda equals() în Java?

sobes.tech AI

Răspuns de la AI

Metoda equals() în Java este utilizată pentru compararea a două obiecte pentru egalitate. În mod implicit, în cazul obiectelor care moștenesc de la Object fără a o suprascrie, compară referințele obiectelor (==), adică verifică dacă variabilele indică aceeași locație de memorie.

Suprascrierea corectă a metodei equals() este importantă pentru compararea obiectelor după conținutul lor, nu după locația în memorie.

Când suprascrieți equals(), trebuie să respectați următoarele reguli:

  • Reflexivitate: pentru orice obiect nenul x, x.equals(x) trebuie să returneze true.
  • Simetrie: pentru orice obiect nenul x și y, dacă x.equals(y) returnează true, atunci și y.equals(x) trebuie să returneze true.
  • Transitivitate: pentru orice obiecte nenule x, y și z, dacă x.equals(y) și y.equals(z) returnează true, atunci și x.equals(z) trebuie să returneze true.
  • Consistență: pentru orice obiecte nenule x și y, multiple apeluri la x.equals(y) trebuie să returneze în mod consecvent același rezultat, atâta timp cât informațiile utilizate pentru comparație nu s-au schimbat.
  • Pentru orice obiect nenul x, x.equals(null) trebuie să returneze false.

De obicei, când suprascrieți equals(), trebuie să suprascrieți și metoda hashCode(), respectând contractul: dacă două obiecte sunt egale conform equals(), codurile lor hash, returnate de hashCode(), trebuie să fie identice. Contrapartea nu este obligatorie: dacă codurile hash sunt identice, obiectele nu trebuie să fie neapărat egale.

Exemplu de suprascriere:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Compararea în sine
        if (this == o) return true;
        // Verificare pentru null și tipul obiectului
        if (o == null || getClass() != o.getClass()) return false;
        // Conversie de tip și comparare pe câmpuri
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Generarea codului hash bazat pe câmpuri
        return Objects.hash(value, name);
    }

    // getters, setters etc.
}