Sobes.tech
Middle

Quelles sont les règles pour les méthodes equals et hashCode?

sobes.tech IA

Réponse de l'IA

  1. Si deux objets sont égaux selon la méthode equals(Object), leurs codes de hachage (renvoyés par la méthode hashCode()) doivent être identiques.
  2. Si deux objets ne sont pas égaux selon la méthode equals(Object), leurs codes de hachage peuvent être identiques ou différents. Il est conseillé d’assurer des codes de hachage différents pour des objets non égaux afin d’améliorer la performance des collections basées sur le hachage.
  3. La méthode hashCode() doit retourner des valeurs identiques pour le même objet lors de plusieurs appels, tant que les informations utilisées pour calculer le code de hachage n’ont pas changé.
  4. Symétrie : pour tout objet a et b, si a.equals(b) est true, alors b.equals(a) doit aussi être true.
  5. Réflexivité : pour tout objet non nul a, a.equals(a) doit être true.
  6. Transitivité : pour tout objet a, b et c, si a.equals(b) est true et b.equals(c) est true, alors a.equals(c) doit aussi être true.
  7. Cohérence : pour tout objet non nul a et b, plusieurs appels à a.equals(b) doivent retourner de façon cohérente true ou false, tant que les informations utilisées dans les comparaisons equals(Object) n’ont pas changé.

Exemple d’implémentation :

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) {
        // Vérification de l’identité des objets
        if (this == o) {
            return true;
        }
        // Vérification du type de l’objet
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        // Cast en le type approprié
        MyClass myClass = (MyClass) o;
        // Comparaison par champs
        return value == myClass.value &&
               Objects.equals(name, myClass.name); // Utilisation de Objects.equals pour gérer null
    }

    @Override
    public int hashCode() {
        // Utilisation de Objects.hash pour générer le code de hachage basé sur les champs
        return Objects.hash(value, name);
    }

    // Autres méthodes...
}