假設您有一個類並且創建了一個可以存儲此類的這個實例的HashSet。如果您嘗試添加相同的實例,則只有一個實例保留在集合中,這很好。如果包含的元素被修改,則Java HashSet包含重複項
但是,如果你有在HashSet的兩個不同的實例,和你拍一,並使其成爲其他的精確副本(通過複製字段),HashSet中隨後將包含兩個重複的實例。
這裏是演示了此代碼:
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;
}
}
從上面的代碼的輸出:
1 a
1 a
3 c
Equals
有沒有辦法迫使HashSet的,以驗證其內容,這樣可以重複條目像上面的場景中創建一樣被刪除?
一個可能的解決方案是創建一個新的HashSet和內容從一個HashSet的複製到另一個,使新的HashSet將不包含重複的,但是我不喜歡這樣的解決方案。
好吧,所以上述情況是無效的。我想唯一的選擇是將內容複製到一個新的HashSet。 –
@ Spi1988正確的解決方案是堅持'Set'的契約,並且在將對象添加到集合後不要修改對象。 – EJP
@PB_MLT通過將內容複製到新的HashSet中可以實現什麼功能? – HungryForKnowledge