电竞比分网-中国电竞赛事及体育赛事平台

分享

HashSet 與TreeSet和LinkedHashSet的區(qū)別

 印度阿三17 2019-03-16

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

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

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

?

?

一、Set接口

?

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

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

????? HashSet與TreeSet都是基于Set接口的實現(xiàn)類。其中TreeSet是Set的子接口SortedSet的實現(xiàn)類。Set接口及其子接口、實現(xiàn)類的結(jié)構(gòu)如下所示:

?

?????????? |——SortedSet接口——TreeSet實現(xiàn)類

?

Set接口——|——HashSet實現(xiàn)類???????????????

?

?????????? |——LinkedHashSet實現(xiàn)類

?

?

二、HashSet

?

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

? ??? 2. 不是同步的

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

?

? ??? 當(dāng)向HashSet結(jié)合中存入一個元素時,HashSet會調(diào)用該對象的hashCode()方法來得到該對象的hashCode值,然后根據(jù) hashCode值來決定該對象在HashSet中存儲位置。

簡單的說,HashSet集合判斷兩個元素相等的標(biāo)準(zhǔn)是兩個對象通過equals方法比較相等,并且兩個對象的hashCode()方法返回值相等

?

??? 注意,如果要把一個對象放入HashSet中,重寫該對象對應(yīng)類的equals方法,也應(yīng)該重寫其hashCode()方法。其規(guī)則是如果兩個對象通過equals方法比較返回true時,其hashCode也應(yīng)該相同。另外,對象中用作equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來計算 hashCode的值。

?

?

三、TreeSet

?

??? TreeSet類型是J2SE中唯一可實現(xiàn)自動排序的類型

?

??? TreeSet是SortedSet接口的唯一實現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認(rèn)的排序方式。向? TreeSet中加入的應(yīng)該是同一個類的對象。

?

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

?

自然排序

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

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

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

如果我們將兩個對象的equals方法總是返回true,則這兩個對象的compareTo方法返回應(yīng)該返回0

?

定制排序

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

?

?

?四、LinkedHashSet

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

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

來源:http://www./content-4-140851.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多