衆所周知,set內容不重複。以hashSet爲例,會使用對象的hashCode()與equals()來判斷存入的對象是否相同。流程如下:
要存入元素,內存中開設空間,每個空間都會有對應的Hash Code,這些空間成爲哈希桶(Hash Bucket)。
對想要存入HashSet回調用對象的hashCode()獲取對應的哈希值,並嘗試放入對應的哈希桶中,如果哈希桶中沒有對象,則直接放入,如果有,會再調用對象的equals()比較。
桶中的對象調用equals()與要傳入的對象進行比較,若比較結果爲false,則表示兩個對象非重複,可以存入,若結果爲true,表示兩個對象相同,不可存入。
例:
學生類(Student),爲了防止收集重複對象,在Student類中複寫hashCode()和equals():
class Studen{
private String name ;//姓名
private int age;//年齡
public int hashCode(){
return name.hashCode()+age*33;
}
public boolean equals(Object obj){
if(!(obj instanceof Student))
throw new ClassCastException("類型不匹配");
Student s=(Student) obj;
return this.name.equals(s.name) &&this.age==s.age;
}
}
如果之後出現重複對象想要被收集時,要存入對象便會和已存在容器內的對象比較,如果相同則不能再存入。