HashSet,TreeSet和LinkedHashSet的區別


總體而言,如果你需要一個訪問快速的Set,你應該使用HashSet;當你需要一個排序的Set,你應該使用TreeSet;當你需要記錄下插入時的順序時,你應該使用LinedHashSet。

Set接口:

      1.Set不允許包含相同的元素,如果試圖把兩個相同元素加入同一個集合中,add方法返回false。

      2.Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。也就是說,只要兩個對象用equals方法比較返回true,Set就不會接受這兩個對象。

                 |——SortedSet接口——TreeSet實現類

Set接口——|——HashSet實現類                

                   |——LinkedHashSet實現類

HashSet:

     1.不能保證元素的排列順序,順序有可能發生變化

      2. 不是同步的

      3. 集合元素可以是null,但只能放入一個null

當向HashSet結合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然后根據 hashCode值來決定該對象在HashSet中存儲位置。

簡單的說,HashSet集合判斷兩個元素相等的標准是兩個對象通過equals方法比較相等,並且兩個對象的hashCode()方法返回值相等

TreeSet:

TreeSet是SortedSet接口的唯一實現類,TreeSet可以確保集合元素處於排序狀態。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認的排序方式。

LinkedHashSet:

LinkedHashSet集合同樣是根據元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順 序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。

LinkedHashSet在迭代訪問Set中的全部元素時,性能比HashSet好,但是插入時性能稍微遜色於HashSet。

java的HashCode方法:

set中,要想保證元素不重復,需要依據Object.equals方法,但是,如果每增加一個元素就檢查一次,那么當元素很多時,后添加到集合中的元素比較的次數就非常多了。

hashCode方法實際上返回的就是對象存儲的物理地址(實際可能並不是)。   這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。 如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。 所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。   所以,Java對於eqauls方法和hashCode方法是這樣規定的:

1、如果兩個對象相同,那么它們的hashCode值一定要相同;

2、如果兩個對象的hashCode相同,它們並不一定相同

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM