【java提高】---HashSet 與TreeSet和LinkedHashSet的區別


HashSet 與TreeSet和LinkedHashSet的區別

         今天項目開發,需要通過兩個條件去查詢數據庫數據,同時只要滿足一個條件就可以取出這個對象。所以通過取出的數據肯定會有重復,所以要去掉重復項。

 如果用list集合接收兩次的返回對象,那么肯定是有重復對象在list集合中,一開始我想到的是TreeSet,但知道TreeSet存放對象,一定要重寫compareto方法,進行排序規則。

而我僅僅是去重,並不需要排序。 所以我就用了HashSet,下面也就縷一縷有關set集合的一些知識點。

 

一、Set接口

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

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

      HashSet與TreeSet都是基於Set接口的實現類。其中TreeSet是Set的子接口SortedSet的實現類。Set接口及其子接口、實現類的結構如下所示:

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

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

                |——LinkedHashSet實現類

 

    二、HashSet

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

      2. 不是同步的

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

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

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

       注意,如果要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規則是如果兩個對象通過equals方法比較返回true時,

其   hashCode也應該相同。另外,對象中用作equals比較標准的屬性,都應該用來計算 hashCode的值。

 

三、TreeSet

       TreeSet類型是J2SE中唯一可實現自動排序的類型

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

        TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0

自然排序

       自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關系,然后將元素按照升序排列。

      Java提供了一個Comparable接口,該接口里定義了一個compareTo(Object obj)方法,該方法返回一個整數值,實現了該接口的對象就可以比較大小。

      obj1.compareTo(obj2)方法如果返回0,則說明被比較的兩個對象相等,如果返回一個正數,則表明obj1大於obj2,如果是 負數,則表明obj1小於obj2。

      如果我們將兩個對象的equals方法總是返回true,則這兩個對象的compareTo方法返回應該返回0
定制排序

      自然排序是根據集合元素的大小,以升序排列,如果要定制排序,應該使用Comparator接口,實現 int compare(To1,To2)方法

 

 四、LinkedHashSet

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

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

 

 想的太多,做的太少,中間的落差就是煩惱,要么去做,要么別想 中尉【6】 

 


免責聲明!

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



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