Normalement un Set ne contient pas 2 éléments qui sont égaux au sens de equals. Donc la classe Main montre un fonctionnement anormal
L'erreur vient d'une erreur dans la classe Personne. Personne redéfinit equals sans redéfinir hashCode, ne respectant pas ce qui est indiqué dans la javadoc de la classe Object : "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.". NE L'OUBLIEZ PAS SI VOUS REDEFINISSEZ LA METHODE equals !
Cette erreur va provoquer un fonctionnement anormal quand on ajoute des instances de Personne dans la classe HashSet. En effet HashSet range ses éléments dans une table de hachage dont les clés sont les hashCode des éléments. Lorsqu'un élement est ajouté dans le HashSet, celui-ci commence par vérifier qu'il ne contient pas déjà un élément égal. Pour cela, il s'appuie sur la spécification de la classe Object et il ne cherche un éventuel élément égal que dans le seau (bucket) des clés qui ont la même valeur de hashCode (c'est ainsi que fonctionnent les tables de hachage). Ainsi, pour notre exemple, le HashSet ne s'apercevra pas qu'il contient déjà une personne nommée "Dupond" car la 2ème personne nommée "Dupond" n'a pas la même valeur de hashCode que la 1ère personne de même nom.
Voici la classe Personne.java avec une méthode hashCode redéfinie pour être compatible avec la méthode equals.