同樣是收集對象,在收集過程中有相同的對象,則不再收集,如果有這樣的需求,那麼可以使用set的接口操作對象。
例如:有一個字符串,當中有很多英文單詞,你想知道不重複的單詞有幾個;
<span style="font-size:18px;"> public class Words{
public static void main (string args[]){
Scanner scanner =new Scanner();
System.out.print(“請輸入英文:”);
String line=scanner.nextLine();
String[] tokens=line.split(“ “);
Set words=new HashSet();
for(String token :tokens){
words.add(token);
}
System.out.print(“不重複單詞有 %d 個:%s%n”,words.size(),words);
}
}
</span>
顯示結果:
當set收集的是自定義的實體對象的時候,卻不能排除相同的數據。例如:
<span style="font-size:18px;">class Student{
private String name;
private String number;
Student(String name,String number){
this.name=name;
this.number=number;
}
public class Students{
public static void main (String[] args){
Set set=new HashSet();
set.add(new Student(“Justin”,”B835031”));
set.add(new Student(“Monica”,”B825032”));
set.add(new Student(“Justin”,”B835031”));
System.out.print(set);
}
}
</span>
結果顯示:並沒有去掉重複的對象。
原因是因爲HashSet會使用對象的hashCode()與equals()來判斷對象是否相同,每個對象的hashCode()取得的值不一樣,纔會導致沒有去掉重複的值。
那麼我們需要做的是,重寫hashCode()方法,讓name和number一樣的Student認爲是相同的。在Student類中寫:
<span style="font-size:18px;">@Override
public int hashCode(){
int hash=5;
hash=13*hash+(this.name!=null?this.name.hashCode():0);
hash=13*hash+(this.number!=null?this.number.hashCode():0);
return hash;
}
</span>
再次執行的時候顯示,消除了相同的對象。