Qu’est-ce qu’un HashSet ?
Un HashSet est une structure de données qui permet de stocker des objets sans ordre et sans doublons.
Mais la phrase importante est celle-ci :
Un HashSet ne sait pas ce qu’est un doublon.
C’est le programmeur qui le lui apprend.
Il ne compare ni les noms, ni les attributs, ni les valeurs visuellement.
Il ne connaît que deux méthodes :
hashCode() et equals().
Il faut TOUJOURS redéfinir equals() et hashCode() en conséquence.
hashCode() → pour choisir le bucket (case de la table de hachage)
equals() → pour comparer deux objets dans le même bucket
Comment HashSet stocke les objets ?
Un HashSet repose sur une table de hachage (hash table).
Imagine une grande armoire avec plein de tiroirs (appelés buckets).
Quand tu ajoutes un objet :
1. Java appelle hashCode() sur l’objet
2. Le nombre retourné sert à choisir un tiroir
3. Dans ce tiroir :
o s’il est vide → l’objet est ajouté
o s’il contient déjà des objets → Java appelle equals() pour comparer
Deux objets ne sont considérés comme doublons que s’ils sont :
dans le même bucket
et que equals() retourne true
Remarque : À chaque fois que le critère d’unicité change, il faut redéfinir equals() et hashCode()
Exemples :
Unicité par CIN → equals/hashCode sur cin
Unicité par âge → equals/hashCode sur age
Unicité par email → equals/hashCode sur email
Sinon, le HashSet se comporte de manière incorrecte.
Exercice
On souhaite modéliser la relation one-to-many entre deux classes Java : Groupe et Etudiant.
Un Etudiant appartient à un seul Groupe.
Un Groupe peut contenir plusieurs Etudiants.
Les étudiants d’un groupe sont stockés dans un HashSet afin d’éviter les doublons.
Chaque étudiant connaît son groupe. Quand on ajoute un étudiant à un groupe, on vérifie s’il n’appartient déjà à
un autre groupe.
Deux étudiants sont considérés comme identiques s’ils ont le même CIN (identifiant unique).
Question : Implémenter les classes Etudiant, Groupe et une classe Main pour tester le fonctionnement du HashSet.