Middle
Care sunt regulile pentru metodele equals și hashCode?
sobes.tech AI
Răspuns de la AI
- Dacă două obiecte sunt egale conform metodei
equals(Object), codurile lor hash (returnate de metodahashCode()) trebuie să fie identice. - 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. - 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. - Simetrie: pentru orice obiect
așib, dacăa.equals(b)estetrue, atuncib.equals(a)trebuie să fie de asemeneatrue. - Reflexivitate: pentru orice obiect nenul
a,a.equals(a)trebuie să fietrue. - Transitivitate: pentru orice obiect
a,bșic, dacăa.equals(b)estetrueșib.equals(c)estetrue, atuncia.equals(c)trebuie să fietrue. - Coerență: pentru orice obiect nenul
așib, multiple apeluri laa.equals(b)trebuie să returneze în mod consecventtruesaufalse, atâta timp cât informațiile utilizate în comparațiileequals(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...
}