Sobes.tech
Middle

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 retourner true.

  • Symétrie : pour toutes valeurs de référence non nulles x et y, x.equals(y) doit retourner true si et seulement si y.equals(x) retourne true.

  • Transitivité : pour toutes valeurs de référence non nulles x, y et z, si x.equals(y) retourne true et y.equals(z) retourne true, alors x.equals(z) doit retourner true.

  • Cohérence : pour toutes valeurs de référence non nulles x et y, plusieurs appels à x.equals(y) doivent retourner constamment true ou constamment false, à condition que aucune information utilisée dans les comparaisons equals des objets ne change entre les appels.

  • Pour toute valeur de référence non nulle x, x.equals(null) doit retourner false.

  • Si deux objets sont égaux selon la méthode equals(Object), alors l'appel à la méthode hashCode pour 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éthode hashCode pour 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
    }
}