Parla dei contratti dei metodi equals e hashCode in Java.
sobes.tech AI
Risposta dell'AI
-
Riflessività: per qualsiasi valore di riferimento diverso da zero
x,x.equals(x)deve restituiretrue. -
Simmetria: per qualsiasi coppia di valori di riferimento diversi da zero
xey,x.equals(y)deve restituiretruese e solo sey.equals(x)restituiscetrue. -
Transitività: per qualsiasi tripla di valori di riferimento diversi da zero
x,yez, sex.equals(y)restituiscetrueey.equals(z)restituiscetrue, allorax.equals(z)deve restituiretrue. -
Coerenza: per qualsiasi coppia di valori di riferimento diversi da zero
xey, le chiamate multiple ax.equals(y)devono restituire costantementetrueo costantementefalse, a condizione che nessuna informazione usata nei confrontiequalsdegli oggetti venga modificata tra le chiamate. -
Per qualsiasi valore di riferimento diverso da zero
x,x.equals(null)deve restituirefalse. -
Se due oggetti sono uguali secondo il metodo
equals(Object), allora la chiamata al metodohashCodeper entrambi gli oggetti deve restituire lo stesso valore intero. -
Non è necessario che, se due oggetti sono diversi secondo il metodo
equals(java.lang.Object), la chiamata al metodohashCodeper entrambi gli oggetti restituisca valori interi diversi. Tuttavia, il programmatore deve capire che generare hash code diversi per oggetti non uguali può migliorare le prestazioni delle tabelle hash.
È importante ridefinire entrambi i metodi equals e hashCode se uno di essi viene ridefinito, per mantenere il contratto. L'uso di equals senza ridefinire hashCode può portare a un funzionamento errato delle collezioni che usano l'hash (ad esempio, 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; // Riflessività
if (o == null || getClass() != o.getClass()) return false; // Controllo null e tipo
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Confronto per contenuto
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Generazione hash basata sui campi
}
}