Normalement un Set ne contient pas 2 éléments qui sont égaux au sens de equals. Donc la classe Main montre un fonctionnement anormal

  1. en ne s'apercevant pas qu'un élément égal a déjà été ajouté dans le Set ;
  2. en ajoutant 2 éléments égaux dans le Set.

Ce fonctionnement anormal vient de ce que le Set est implémenté avec la classe HashSet qui range les valeurs dans une table de hachage dont les clés sont les hashCode des éléments. Lorsqu'un élement est ajouté dans le Set, celui-ci commence par vérifier qu'il ne contient pas déjà un élément égal. Pour cela, il ne cherche l'élément que dans le seau (bucket) des clés qui ont la même valeur de hashCode. Ainsi, le Set ne s'apercevra pas qu'il contient 2 éléments égaux s'ils n'ont pas la même valeur de hashCode.

Ceci ne devrait jamais arriver car dans la spécification de la méthode hashCode il est écrit : "If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result."

La classe Personne.java donnée par l'énoncé ne respecte pas cette contrainte. Voici la classe Personne.java avec une méthode hashCode redéfinie pour être compatible avec la méthode equals.