HashSet的底層用哈希散列表來存儲對象(默認長度為16的數組),
假如:
Set set=new HashSet(); set.add(obj);
內部存儲過程為:定義h=obj.hashCode,得到obj對象的哈希碼h,再對h進行hash散列運算,對數組長度進行求余,假如長度為16,則返回一個0-15之間的值,然后這個值就是存在HashSet數組中的下標。如果下標位置沒有對象(不起沖突),則把obj加到該位置;如果已近有對象(起沖突),則用equals判斷兩對象是否相等,相等則舍棄obj,不相等,則把obj以節點的方式加在該對象下面。
所以,只有覆蓋了對象的equals方法和hashCode方法,讓此方法按自己的算法運算的話才能算是相同的對象,覆蓋hashCode方法的原則:
原則1:讓equals相等的對象返回相同的hashCode(為了過濾掉相等的元素)
原則2:盡量保證equals不相同的對象返回不同的hashCode(為了添加不同的元素)

