Nehmen wir an, Sie haben eine Klasse und Sie erstellen ein HashSet, das diese Instanzen dieser Klasse speichern kann. Wenn Sie versuchen, Instanzen hinzuzufügen, die gleich sind, wird nur eine Instanz in der Auflistung beibehalten, und das ist in Ordnung.Java HashSet enthält Duplikate, wenn das enthaltene Element geändert wurde
Wenn Sie jedoch zwei verschiedene Instanzen im HashSet haben und eine davon nehmen und eine exakte Kopie der anderen erstellen (indem Sie die Felder kopieren), enthält das HashSet zwei doppelte Instanzen.
Hier ist der Code, der dies zeigt:
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;
}
}
Die Ausgabe aus dem obigen Code:
1 a
1 a
3 c
Equals
Gibt es eine Möglichkeit zu zwingen, die HashSet zu validieren seinen Inhalt, so dass mögliche doppelte Einträge erstellt wie im obigen Szenario erhalten entfernt?
Eine mögliche Lösung könnte sein, ein neues HashSet zu erstellen und den Inhalt von einem Hashset auf ein anderes zu kopieren, so dass das neue Hashset keine Duplikate enthält, aber ich mag diese Lösung nicht.
Okay, so das obige Szenario ist ungültig. Ich denke, die einzige Möglichkeit besteht darin, den Inhalt in ein neues HashSet zu kopieren. –
@ Spi1988 Die richtige Lösung besteht darin, sich an den Vertrag von 'Set' zu halten und Objekte nicht zu ändern, nachdem Sie sie der Sammlung hinzugefügt haben. – EJP
@PB_MLT was erreichen Sie, indem Sie den Inhalt in neues HashSet kopieren? – HungryForKnowledge