Set集合-HashSet

HashSet是Set接口的典型實現,大多數使用set集合時就是使用這個實現類.HashSet是按照Hash算法來存儲集合中的元素,所以具備很好的存取和查找性能.算法

HashSet具備如下特色:數據結構

  • 不能保證元素的排列有序,順序可能與添加的順序不一樣,順序可能發生變化
  • HashSet不是同步的,若是多個線程同時訪問一個HashSet,假設兩個或者兩個以上的線程同時修改了Hashset集合時,則必須經過代碼來保證其同步
  • 集合中的元素能夠是null

        當向HashSet集合中的存入一個元素時,HashSet會調用該對象的hashCode()方法來獲得該對象的hashCode值,而後根據該hashCode值決定該對象的HashSet中的位置.若是有兩個元素經過equals()方法返回true,但他們的hashCode()方法返回值不相等,HashSet將會把它們存儲在不一樣的位置,依然能夠添加成功.    也就是說,HashSet集合判斷兩個元素相等的標準是兩個對象經過equals()方法比較相等,而且兩個對象的hashCode()方法返回值也相等.性能

注意:線程

        若是須要把某個類的對象保存到Hashset集合中,重寫這個類的equals()方法和hashCode()方法時,應該儘可能保證兩個對象經過equals()方法比較返回true時,他們的hashCode()方法的返回值也相等對象

 

重寫hashCode()方法的基本規則:排序

  1. 在程序運行的過程當中,同一個對象屢次調用hashCode方法應該返回相同的值.
  2. 當兩個對象經過equals()方法比較返回true時,這兩個對象的hashCode()方法應該返回相等的值
  3. 對象中用做equals()方法比較標準的實例變量,都應該用於計算hashCode值

LinkedHashSet也是根據元素的hashCode值來決定元素的存儲位置,但它同時使用鏈表維護元素的次序,這樣使得元素看起來像是以插入的順序保存的(雖然LinkedHashSet 使用了鏈表的記錄集合元素的添加順序,但LinkedHashset依然是HashSet,所以它依然不容許集合元素的重複)接口

 

TreeSet類是sorted接口的實現類,TreeSet能夠確保集合元素處理排序的狀態.與TreeSet還提供了以下幾個額外的方法:同步

TreeSet並非根據元素的插入順序進行排序的,而是根據元素的實際的大小來進行排序的.hash

與HashSet集合採用的hash算法來決定元素的存儲位置不一樣,TreeSet採用紅黑樹的數據結構來存儲集合元素class

TreeSet支持兩種排序方法:天然排序和定製排序.在默認狀況下采用天然排序.

相關文章
相關標籤/搜索