Java HashSet содержит дубликаты, если содержащийся элемент изменен

Позволять'скажем, у вас есть класс, и вы создаете HashSet, который может хранить эти экземпляры этого класса. Если вы попытаетесь добавить экземпляры, которые равны, в коллекции останется только один экземпляр, и это нормально.

Однако, если у вас есть два разных экземпляра в HashSet, и вы берете один и делаете его точной копией другого (копируя поля), HashSet будет содержать два повторяющихся экземпляра.

Вот код, который демонстрирует это:

 public static void main(String[] args)
    {
         HashSet 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;
        }
    }

Выход из вышеприведенного кода:

1 a
1 a
3 c
Equals

Есть ли способ заставить HashSet проверить его содержимое, чтобы удалить возможные повторяющиеся записи, созданные, как в приведенном выше сценарии?

Возможным решением может быть создание нового HashSet и копирование содержимого из одного хэш-набора в другой, чтобы новый хэш-набор победил.не содержат дубликатов, однако я неМне не нравится это решение.

Ответы на вопрос(6)

Ваш ответ на вопрос