Sobes.tech
Middle

Care sunt regulile pentru metodele equals și hashCode?

sobes.tech AI

Răspuns de la AI

  1. Dacă două obiecte sunt egale conform metodei equals(Object), codurile lor hash (returnate de metoda hashCode()) trebuie să fie identice.
  2. Dacă două obiecte nu sunt egale conform metodei equals(Object), codurile lor hash pot fi la fel sau diferite. Este o practică bună să se asigure coduri hash diferite pentru obiecte ne-egale pentru o performanță mai bună a colecțiilor bazate pe hash.
  3. Metoda hashCode() trebuie să returneze valori identice pentru același obiect în multiple apeluri, atâta timp cât informațiile folosite pentru calcularea hash-ului nu s-au schimbat.
  4. Simetrie: pentru orice obiect a și b, dacă a.equals(b) este true, atunci b.equals(a) trebuie să fie de asemenea true.
  5. Reflexivitate: pentru orice obiect nenul a, a.equals(a) trebuie să fie true.
  6. Transitivitate: pentru orice obiect a, b și c, dacă a.equals(b) este true și b.equals(c) este true, atunci a.equals(c) trebuie să fie true.
  7. Coerență: pentru orice obiect nenul a și b, multiple apeluri la a.equals(b) trebuie să returneze în mod consecvent true sau false, atâta timp cât informațiile utilizate în comparațiile equals(Object) nu s-au schimbat.

Exemplu de implementare:

public class MyClass {

    private int value;
    private String name;

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

    @Override
    public boolean equals(Object o) {
        // Verificare identitate obiect
        if (this == o) {
            return true;
        }
        // Verificare tip obiect
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Cast
        MyClass myClass = (MyClass) o;
        // Comparare pe campuri
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Folosim Objects.equals pentru null
    }

    @Override
    public int hashCode() {
        // Utilizare Objects.hash
        return Objects.hash(value, name);
    }

    // Alte metode...
}