您需要重寫從Object繼承的equals和hashcode方法。 Java不知道這兩個對象是平等的,除非你告訴它要比較什麼。 Hashset類將調用您的對象的equals方法來做比較
讓我們以汽車爲例,它有兩個字段;類型和顏色。如果兩個物體是相同類型和相同顏色,則它們將被視爲相等。
如果不重寫equals方法,我們會得到錯誤的時候,我們有兩個對象是相同
public class Car {
private String type;
private String color;
public Car(String type, String color) {
super();
this.type = type;
this.color = color;
}
public static void main(String[] args) {
Car car1 = new Car("Suv","Green");
Car car2 = new Car("Suv","Green");
System.out.println(car1.equals(car2)); //false
}
}
在這個例子中,我們將告訴java的
我們如何想通過覆蓋等於方法比較對象
private String type;
private String color;
public Car(String type, String color) {
super();
this.type = type;
this.color = color;
}
@Override
public boolean equals(Object obj) {
if (this.getClass() == obj.getClass()){
Car other =(Car)obj;
if(this.color.equals(other.color) && this.type.equals(other.type)){
return true;
}
}
return false;
}
public static void main(String[] args) {
Car car1 = new Car("Suv","Green");
Car car2 = new Car("Suv","Green");
System.out.println(car1.equals(car2)); //true
}
運行此示例,您將變爲true。
如果你用沒有重寫的equals的對象測試一個hashset,你將在它們中都有兩個類,因爲java認爲它們是不同的對象,因爲equals返回false。用重寫的方法測試它,你將只有一個
任何時候你重寫equals也應該重寫hashCode。用你最喜歡的IDE來幫你解決這些問題。
希望這會有所幫助!
我會推薦HashSet來代替TreeSet,因爲它的速度要快很多(大多數基本操作的常量時間和日誌時間),並且也沒有要求保留元素的順序。 –
當然,以前只是使用過TreeSets,所以習慣這種習慣。更改了代碼 – MatthiasLaug
直接使用該集合而不是使用中間列表不會使OP的問題消失。 –