Java HashSet contient des doublons, si le contenu de l'élément est modifié

Disons que vous avez un groupe et vous créer un HashSet qui peut stocker ces instances de cette classe. Si vous essayez d'ajouter des instances qui sont les mêmes, seul un exemplaire est conservé dans la collection, et c'est très bien.

Toutefois, si vous avez deux instances différentes dans le HashSet, et vous en prenez une et en faire une copie exacte de l'autre (en copiant les champs), le HashSet contient alors deux instances dupliquées.

Voici le code qui illustre cela:

 public static void main(String[] args)
    {
         HashSet<GraphEdge> set = new HashSet<>();
        GraphEdge edge1 = new GraphEdge(1, "a");
        GraphEdge edge2 = new GraphEdge(2, "b");
        GraphEdge edge3 = new GraphEdge(3, "c");

        set.add(edge1);
        set.add(edge2);
        set.add(edge3);

        edge2.setId(1);
        edge2.setName("a");

        for(GraphEdge edge: set)
        {
            System.out.println(edge.toString());
        }

        if(edge2.equals(edge1))
        {
            System.out.println("Equals");
        }
        else
        {
            System.out.println("Not Equals");
        }
    }

    public class GraphEdge
    {
        private int id;
        private String name;

        //Constructor ...

        //Getters & Setters...

        public int hashCode()
        {
        int hash = 7;
        hash = 47 * hash + this.id;
        hash = 47 * hash + Objects.hashCode(this.name);
        return hash;    
        }

        public boolean equals(Object o)
        {
            if(o == this)
            {
                return true;
            }

            if(o instanceof GraphEdge)
            {
                GraphEdge anotherGraphEdge = (GraphEdge) o;
                if(anotherGraphEdge.getId() == this.id && anotherGraphEdge.getName().equals(this.name))
                {
                    return true;
                }
            }

                return false;
        }
    }

La sortie du code ci-dessus:

1 a
1 a
3 c
Equals

Est-il un moyen pour forcer le HashSet de valider son contenu afin que les éventuels doublons créés que dans le scénario ci-dessus sont supprimés?

Une solution possible pourrait être de créer un nouveau HashSet et de copier le contenu d'un hashset à l'autre de sorte que le new hashset de ne pas contenir de doublons cependant je n'aime pas cette solution.

OriginalL'auteur PB_MLT | 2012-10-28