HashSet簡介java
HashSet是Set接口的典型實現,大多數時候使用Set集合時就是使用這個實現類。HashSet按Hash算法來存儲集合中的元素,所以具備良好的存取和查找性能。算法
HashSet特色性能
1.不能保證元素的排列順序,順序可能與添加的順序不一樣,順序也可能發生變化。線程
2.HashSet不是同步的,若是多個線程同時訪問一個HashSet,假設有兩個或者兩個以上線程同時修改了HashSet集合時,則必須經過代碼來保證其同步。對象
3.集合元素多是null。接口
HashSet存儲元素的原理同步
當向HashSet集合中存入一個元素時,HashSet會調用該對象的hashCode()方法來獲得的hashCode值,而後根據該hashCode值決定該對象在HashSet中的存儲位置。hash
若是有兩個元素經過equals()方法比較返回true,但它們的hashCode()方法返回值不相同,Hashset將會把它們存儲在不一樣的位置,依然能夠添加成功。也就是說,HashSet原理
集合判斷兩個元素相等的標準是兩個對象經過equals()方法比較相等,而且兩個對象的hashCode()方法返回值也相等。方法
注意:
1.若是兩個對象經過equals()方法比較返回true,但這兩個對象的hashCode()方法返回不一樣的hashCode值時,這將致使HashSet會把這兩個對象保存在Hash表的不一樣位置,
從而是使兩個對象均可以添加成功,這就與Set集合的規則衝突了。
2.若是兩個對象的hashCode()方法返回的hashCode值相同,可是它們經過equals()方法比較返回false時將更麻煩:由於兩個對象的hashCode值相同,HashSet將試圖把它們
保存在同一個位置,但又不行(不然將只剩下一個對象),因此實際上會在這個位置用鏈式結構保存多個對象;而HashSet訪問集合元素時也是根據元素的hashCode值來快速定位的,若是HashSet中兩個以上的元素具備相同的hashCode值,將會致使性能降低。
3.若是須要把某個類的對象保存到HashSet集合中,重寫這個類的equals()方法和hashCode()方法時,應該儘可能保證兩個對象經過equals()方法比較返回true時,他們的hashCode()方法返回值也相等。
爲了便於記憶,讓本身更清楚的理解hashSet的概念,我摘抄了《瘋狂java講義》這本書的以上內容,但願能幫到你們,也幫到本身。