Java集合中的Set

Set 有去重的特性,該體系集合用於存儲無序(存入和取出的順序不一定相同)元素,值不能重複。對象的相等性本質是對象hashCode值(java是依據對象的內存地址計算出的此序號)判斷的,如果想要讓兩個不同的對象視爲相等的,就必須覆蓋Object的hashCode方法和equals方法。

  • HashSet

HashSet 通過hashCode值來確定元素在內存中的位置。一個hashCode位置上可以存放多個元素。HashSet存儲元素的順序並不是按照存入時的順序(和List顯然不同) 而是按照哈希值來存的所以取數據也是按照哈希值取得。元素的哈希值是通過元素的hashcode 方法來獲取的, HashSet首先判斷兩個元素的哈希值,如果哈希值一樣,接着會比較equals 方法 如果 equls結果爲true ,HashSet就視爲同一個元素。如果equals 爲false就不是同一個元素。 哈希值相同equals爲false的元素是怎麼存儲呢,就是在同樣的哈希值下順延(可以認爲哈希值相同的元素放在一個哈希桶中)。也就是哈希一樣的存一列。如下圖左邊表示hashCode值不相同的情況;右邊表示hashCode值相同,但equals不相同的情況。

  • TreeSet

TreeSet()是使用二叉樹的原理對新add()的對象按照指定的順序排序(升序、降序),每增加一個對象都會進行排序,將對象插入的二叉樹指定的位置。 字符串和數值型對象都可以進行默認的TreeSet排序,而自定義類的對象是不可以的,自己定義的類必須實現Comparable接口,並且覆寫相應的compareTo()函數,纔可以正常使用。 在覆寫compare()函數時,要返回相應的值才能使TreeSet按照一定的規則來排序。比較此對象與指定對象的順序。如果該對象小於、等於或大於指定對象,則分別返回負整數、零或正整數。

  • LinkHashSet

對於 LinkedHashSet 而言,它繼承與 HashSet、又基於 LinkedHashMap 來實現的。LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法操作上又與HashSet相同,因此LinkedHashSet 的實現上非常簡單,只提供了四個構造方法,並通過傳遞一個標識參數,調用父類的構造器,底層構造一個 LinkedHashMap 來實現,在相關操作上與父類HashSet的操作相同,直接調用父類HashSet的方法即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章