Skip to content

🔑 La mĂ©thode hashCode() en Java

1. Définition

  • hashCode() est une mĂ©thode hĂ©ritĂ©e de la classe Object.
  • Elle renvoie un entier (int) appelĂ© code de hachage de l'objet.
  • Ce code est utilisĂ© par les structures de donnĂ©es basĂ©es sur le hachage :
    • HashMap (dictionnaire clĂ© → valeur)
    • HashSet (ensemble)
    • Hashtable

👉 RĂšgle gĂ©nĂ©rale : deux objets Ă©gaux (selon equals) doivent avoir le mĂȘme hashCode().


2. Contrat entre equals() et hashCode()

En Java, il y a une rĂšgle fondamentale :

  1. Si a.equals(b) est vrai → alors a.hashCode() == b.hashCode() doit aussi ĂȘtre vrai.
  2. Si a.equals(b) est faux → rien n'oblige les hashcodes Ă  ĂȘtre diffĂ©rents. (mais c'est mieux pour les performances).

👉 Exemple d'erreur classique : redĂ©finir equals() sans redĂ©finir hashCode().


3. Exemple simple (problĂšme)

class Personne {
    String nom;

    Personne(String nom) { this.nom = nom; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Personne)) return false;
        Personne p = (Personne) o;
        return nom.equals(p.nom);
    }
}

public class Test {
    public static void main(String[] args) {
        Personne p1 = new Personne("Alice");
        Personne p2 = new Personne("Alice");

        System.out.println(p1.equals(p2));  // true

        java.util.HashSet<Personne> set = new java.util.HashSet<>();
        set.add(p1);
        set.add(p2);
        System.out.println(set.size()); // ❌ 2 au lieu de 1
    }
}

4. Solution : redéfinir hashCode()

import java.util.Objects;

class Personne {
    String nom;

    Personne(String nom) { this.nom = nom; }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Personne)) return false;
        Personne p = (Personne) o;
        return Objects.equals(nom, p.nom);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nom);
    }
}

5. Méthodes pour générer un bon hashCode()

a) Utiliser Objects.hash(...)

@Override
public int hashCode() {
    return Objects.hash(nom, prenom, age);
}

b) Utiliser String.hashCode() (quand un seul champ suffit)

@Override
public int hashCode() {
    return nom.hashCode();
}

c) Génération automatique

La plupart des IDE (IntelliJ, Eclipse, NetBeans) peuvent générer equals() et hashCode() automatiquement.


6. Importance

  • Sans hashCode(), vos objets se comportent mal dans HashMap ou HashSet.
  • Vous risquez d'avoir des doublons ou des recherches impossibles.

8. Résumé

  • equals() → dĂ©finit l'Ă©galitĂ© logique entre objets.
  • hashCode() → donne un entier cohĂ©rent avec equals.
  • Les structures comme HashSet et HashMap utilisent les deux.

👉 Toujours redĂ©finir hashCode() quand vous redĂ©finissez equals().