Parlez-moi des contrats des méthodes equals et hashCode en Java.
sobes.tech IA
Réponse de l'IA
-
Réflexivité : pour toute valeur de référence non nulle
x,x.equals(x)doit retournertrue. -
Symétrie : pour toutes valeurs de référence non nulles
xety,x.equals(y)doit retournertruesi et seulement siy.equals(x)retournetrue. -
Transitivité : pour toutes valeurs de référence non nulles
x,yetz, six.equals(y)retournetrueety.equals(z)retournetrue, alorsx.equals(z)doit retournertrue. -
Cohérence : pour toutes valeurs de référence non nulles
xety, plusieurs appels àx.equals(y)doivent retourner constammenttrueou constammentfalse, à condition que aucune information utilisée dans les comparaisonsequalsdes objets ne change entre les appels. -
Pour toute valeur de référence non nulle
x,x.equals(null)doit retournerfalse. -
Si deux objets sont égaux selon la méthode
equals(Object), alors l'appel à la méthodehashCodepour chacun des deux objets doit donner la même valeur entière. -
Il n'est pas nécessaire que si deux objets ne sont pas égaux selon la méthode
equals(java.lang.Object), l'appel à la méthodehashCodepour chacun des deux objets donne des valeurs entières différentes. Cependant, le programmeur doit comprendre que générer des codes de hachage différents pour des objets non égaux peut améliorer la performance des tables de hachage.
Il est important de redéfinir à la fois equals et hashCode si l'un d'eux est redéfini, pour maintenir le contrat. Utiliser equals sans redéfinir hashCode peut conduire à un fonctionnement incorrect des collections utilisant le hachage (par exemple, 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; // Réflexivité
if (o == null || getClass() != o.getClass()) return false; // Vérification null et type
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Comparaison par contenu
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Génération de hash basée sur les champs
}
}