Sobes.tech
Junior

Que fait la méthode equals() en Java?

sobes.tech IA

Réponse de l'IA

La méthode equals() en Java est utilisée pour comparer deux objets pour l'égalité. Par défaut, dans le cas d'objets héritant de Object sans la redéfinir, elle compare les références des objets (==), c'est-à-dire vérifie si les variables pointent vers la même zone mémoire.

Redéfinir correctement la méthode equals() est important pour comparer les objets par leur contenu, et non par leur emplacement en mémoire.

Lors de la redéfinition de equals(), il faut suivre les règles suivantes :

  • Réflexivité : pour tout objet non nul x, x.equals(x) doit retourner true.
  • Symétrie : pour tous objets non nuls x et y, si x.equals(y) retourne true, alors y.equals(x) doit aussi retourner true.
  • Transitivité : pour tous objets non nuls x, y et z, si x.equals(y) retourne true et y.equals(z) retourne true, alors x.equals(z) doit aussi retourner true.
  • Cohérence : pour tous objets non nuls x et y, plusieurs appels à x.equals(y) doivent retourner de façon cohérente le même résultat, tant que l'information utilisée pour la comparaison ne change pas.
  • Pour tout objet non nul x, x.equals(null) doit retourner false.

En général, lors de la redéfinition de equals(), il faut aussi redéfinir la méthode hashCode(), en respectant le contrat : si deux objets sont égaux selon equals(), leurs codes de hachage, retournés par hashCode(), doivent être identiques. La réciprocité n'est pas obligatoire : si les codes de hachage sont identiques, les objets ne sont pas nécessairement égaux.

Exemple de redéfinition :

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // Comparaison elle-même
        if (this == o) return true;
        // Vérification de null et du type d'objet
        if (o == null || getClass() != o.getClass()) return false;
        // Conversion de type et comparaison par champs
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // Génération du code de hachage basé sur les champs
        return Objects.hash(value, name);
    }

    // getters, setters, etc.
}