Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
?? ? ? ?這幾天看了下容器的源碼,總結(jié)一下HashSet vs TreeSet vs LinkedHashSet的區(qū)別, 如下圖,collection的繼承實(shí)現(xiàn)分支,這里先只講解set分支
1、HashSet vs TreeSet vs LinkedHashSet三者的數(shù)據(jù)結(jié)構(gòu)分析
?????(1)HashSet:由哈希表(實(shí)際上是一個(gè)HashMap實(shí)例)支持。它不保證set?的迭代順序;特別是它不保證該順序恒久不變。此類允許使用null元素。對(duì)于HashSet中保存的對(duì)象,請(qǐng)注意正確重寫其equals和hashCode方法,以保證放入的對(duì)象的唯一性。
?????注意:hashSet是利用HashMap的key進(jìn)行數(shù)據(jù)存儲(chǔ)。同時(shí)HashMap的key具有唯一性
?????參考:http://www.cnblogs.com/ITtangtang/p/3948538.html
? ? (2) TreeSet:TreeSet實(shí)際上是TreeMap實(shí)現(xiàn)的。當(dāng)我們構(gòu)造TreeSet時(shí);若使用不帶參數(shù)的構(gòu)造函數(shù),則TreeSet的使用自然比較器;若用戶需要使用自定義的比較器,則需要使用帶比較器的參數(shù)。
? ? ? 參考:http://www.cnblogs.com/skywang12345/p/3311268.html
?????(3) LinkedHashSet:?LinkedHashSet也是一個(gè)集合,與HashSet不同的是,LinkedHashSet是有序的,由于其繼承了HashSet,所以構(gòu)造方法中調(diào)用的是HashSet的構(gòu)造方法,在HashSet的構(gòu)造方法中有一個(gè)專門為LinkedHashSet重寫的構(gòu)造方法。并且其內(nèi)部利用LinkedHashMap實(shí)現(xiàn)的。
????? 參考:http://blog.csdn.net/wxl1234579/article/details/54971525
?
總結(jié):
????????使用Set集合的主要原因是因?yàn)镾et集合里面沒有重復(fù)的元素。Set集合有三個(gè)常見的實(shí)現(xiàn)類:HashSet,TreeSet,LinkedHashSet。什么時(shí)候,選擇哪一個(gè)使用非常重要。簡(jiǎn)單的說,如果你關(guān)注性能,應(yīng)該使用HashSet;如果你需要一個(gè)有序的Set集合,應(yīng)該使用TreeSet;如果你需要一個(gè)Set集合保存了原始的元素插入順序,應(yīng)該使用LinkedHashSet。
????????? ?注意:如果要詳細(xì)研究set的原理,請(qǐng)去查看相對(duì)應(yīng)的map實(shí)現(xiàn)
?
轉(zhuǎn)載于:https://my.oschina.net/jiahaov/blog/1552616
總結(jié)
以上是生活随笔為你收集整理的Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (10)变量提升
- 下一篇: Java语言的替代品:JVM的新编程语言