Java 之HashSet、LinkedHashSet、TreeSet比较
4.HashSet、LinkedHashSet、TreeSet比較
Set接口
Set不允許包含相同的元素,如果試圖把兩個(gè)相同元素加入同一個(gè)集合中,add方法返回false。
Set判斷兩個(gè)對(duì)象相同不是使用==運(yùn)算符,而是根據(jù)equals方法。也就是說(shuō),只要兩個(gè)對(duì)象用equals方法比較返回true,Set就不會(huì)接受這兩個(gè)對(duì)象。
HashSet
HashSet有以下特點(diǎn):
->? 不能保證元素的排列順序,順序有可能發(fā)生變化。
->? 不是同步的。
->? 集合元素可以是null,但只能放入一個(gè)null。
??? 當(dāng)向HashSet結(jié)合中存入一個(gè)元素時(shí),HashSet會(huì)調(diào)用該對(duì)象的hashCode()方法來(lái)得到該對(duì)象的hashCode值,然后根據(jù) hashCode值來(lái)決定該對(duì)象在HashSet中存儲(chǔ)位置。簡(jiǎn)單的說(shuō),HashSet集合判斷兩個(gè)元素相等的標(biāo)準(zhǔn)是兩個(gè)對(duì)象通過(guò)equals方法比較相等,并且兩個(gè)對(duì)象的hashCode()方法返回值也相等。
??? 注意,如果要把一個(gè)對(duì)象放入HashSet中,重寫(xiě)該對(duì)象對(duì)應(yīng)類(lèi)的equals方法,也應(yīng)該重寫(xiě)其hashCode()方法。其規(guī)則是如果兩個(gè)對(duì)象通過(guò)equals方法比較返回true時(shí),其hashCode也應(yīng)該相同。另外,對(duì)象中用作equals比較標(biāo)準(zhǔn)的屬性,都應(yīng)該用來(lái)計(jì)算 hashCode的值。
LinkedHashSet
??? LinkedHashSet集合同樣是根據(jù)元素的hashCode值來(lái)決定元素的存儲(chǔ)位置,但是它同時(shí)使用鏈表維護(hù)元素的次序。這樣使得元素看起來(lái)像是以插入順序保存的,也就是說(shuō),當(dāng)遍歷該集合時(shí)候,LinkedHashSet將會(huì)以元素的添加順序訪問(wèn)集合的元素。
??? LinkedHashSet在迭代訪問(wèn)Set中的全部元素時(shí),性能比HashSet好,但是插入時(shí)性能稍微遜色于HashSet。
TreeSet類(lèi)
??? TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類(lèi),TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。向TreeSet中加入的應(yīng)該是同一個(gè)類(lèi)的對(duì)象。
????TreeSet判斷兩個(gè)對(duì)象不相等的方式是兩個(gè)對(duì)象通過(guò)equals方法返回false,或者通過(guò)CompareTo方法比較沒(méi)有返回0。
自然排序
??? 自然排序使用要排序元素的CompareTo(Object obj)方法來(lái)比較元素之間大小關(guān)系,然后將元素按照升序排列。
??? Java提供了一個(gè)Comparable接口,該接口里定義了一個(gè)compareTo(Object obj)方法,該方法返回一個(gè)整數(shù)值,實(shí)現(xiàn)了該接口的對(duì)象就可以比較大小。obj1.compareTo(obj2)方法如果返回0,則說(shuō)明被比較的兩個(gè)對(duì)象相等,如果返回一個(gè)正數(shù),則表明obj1大于obj2,如果是負(fù)數(shù),則表明obj1小于obj2。如果我們將兩個(gè)對(duì)象的equals方法總是返回true,則這兩個(gè)對(duì)象的compareTo方法返回應(yīng)該返回0。
定制排序
??? 自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應(yīng)該使用Comparator接口,實(shí)現(xiàn) int compare(T o1,T o2)方法。
輸出結(jié)果:
HashSet 順序:[D, E, F, A, B, C] LinkedHashSet 順序:[B, A, D, E, C, F] TreeSet 順序:[A, B, C, D, E, F]總結(jié)
以上是生活随笔為你收集整理的Java 之HashSet、LinkedHashSet、TreeSet比较的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: shiro学习(17):easyui布局
- 下一篇: Java(ArrayList和Linke