Sobes.tech
Middle

Vorbește despre contractele metodelor equals și hashCode în Java.

sobes.tech AI

Răspuns de la AI

  • Reflxivitate: pentru orice valoare de referință nenulă x, x.equals(x) trebuie să returneze true.

  • Simetrie: pentru orice pereche de valori de referință nenule x și y, x.equals(y) trebuie să returneze true dacă și numai dacă y.equals(x) returnează true.

  • Transitivitate: pentru orice triplet de valori de referință nenule x, y și z, dacă x.equals(y) returnează true și y.equals(z) returnează true, atunci x.equals(z) trebuie să returneze true.

  • Coerență: pentru orice pereche de valori de referință nenule x și y, apelurile multiple la metoda x.equals(y) trebuie să returneze constant true sau constant false, cu condiția ca nicio informație utilizată în comparațiile equals ale obiectelor să nu se schimbe între apeluri.

  • Pentru orice valoare de referință nenulă x, x.equals(null) trebuie să returneze false.

  • Dacă două obiecte sunt egale conform metodei equals(Object), atunci apelul metodei hashCode pentru fiecare dintre cele două obiecte trebuie să dea aceeași valoare întreagă.

  • Nu este necesar ca, dacă două obiecte nu sunt egale conform metodei equals(java.lang.Object), apelul metodei hashCode pentru fiecare dintre cele două obiecte să dea valori întregi diferite. Cu toate acestea, programatorul trebuie să înțeleagă că generarea de hash-uri diferite pentru obiecte inegale poate îmbunătăți performanța tabelelor hash.

Este important să se redefinească ambele metode equals și hashCode dacă una dintre ele este redefinită, pentru a menține contractul. Utilizarea equals fără redefinirea hashCode poate duce la funcționarea incorectă a colecțiilor care utilizează hashing (de exemplu, HashMap, HashSet).

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Reflxivitate
        if (o == null || getClass() != o.getClass()) return false; // Verificare null și tip
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Comparare conținut
    }

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