đ La mĂ©thode hashCode() en Java¶
1. DĂ©finition¶
hashCode()est une méthode héritée de la classeObject.- 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 :
- Si
a.equals(b)est vrai â alorsa.hashCode() == b.hashCode()doit aussi ĂȘtre vrai. - 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(...)¶
b) Utiliser String.hashCode() (quand un seul champ suffit)¶
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 dansHashMapouHashSet. - 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 avecequals.- Les structures comme
HashSetetHashMaputilisent les deux.
đ Toujours redĂ©finir hashCode() quand vous redĂ©finissez
equals().