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ă returnezetrue. -
Simetrie: pentru orice pereche de valori de referință nenule
xșiy,x.equals(y)trebuie să returnezetruedacă și numai dacăy.equals(x)returneazătrue. -
Transitivitate: pentru orice triplet de valori de referință nenule
x,yșiz, dacăx.equals(y)returneazătrueșiy.equals(z)returneazătrue, atuncix.equals(z)trebuie să returnezetrue. -
Coerență: pentru orice pereche de valori de referință nenule
xșiy, apelurile multiple la metodax.equals(y)trebuie să returneze constanttruesau constantfalse, cu condiția ca nicio informație utilizată în comparațiileequalsale obiectelor să nu se schimbe între apeluri. -
Pentru orice valoare de referință nenulă
x,x.equals(null)trebuie să returnezefalse. -
Dacă două obiecte sunt egale conform metodei
equals(Object), atunci apelul metodeihashCodepentru 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 metodeihashCodepentru 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
}
}