Java集合(十二)--非同步集合總結(jié)

經(jīng)過(guò)十一篇文章的分析渗柿,終于把一些主要的集合類的實(shí)現(xiàn)原理分析完了饱亮。本文矾芙,我們將對(duì)之前分析的知識(shí)點(diǎn)做一次總結(jié)。

集合框架:集合有兩個(gè)根接口近上,分別是Collection和Map剔宪。其中Collection中又分為L(zhǎng)ist、Set和Queue壹无。

Java集合(一)--集合框架簡(jiǎn)析

List

List是一種有序不唯一的元素集合葱绒,有ArrayList和LinkedList等多個(gè)實(shí)現(xiàn)類。

ArrayList

ArrayList實(shí)現(xiàn)了RandomAccess等接口斗锭,支持快速隨機(jī)訪問(wèn)地淀。它是基于數(shù)組實(shí)現(xiàn)的,內(nèi)部維護(hù)了一個(gè)默認(rèn)初始容量為10的elementData數(shù)組岖是。此數(shù)組是一個(gè)動(dòng)態(tài)數(shù)組帮毁,在數(shù)組容量不足以容納當(dāng)前元素的時(shí)候會(huì)進(jìn)行擴(kuò)容,擴(kuò)容到原數(shù)組的3/2豺撑,但是容量最大不超過(guò)0x7fffffff(是一個(gè)16進(jìn)制的數(shù)烈疚,值為:2^31 - 1,是最大的int數(shù)值)聪轿。ArrayList的get和set方法都是通過(guò)操作角標(biāo)完成對(duì)數(shù)組的操作爷肝,所以相對(duì)來(lái)說(shuō)比較快。而add和remove方法屹电,由于涉及到數(shù)組的拷貝阶剑,所以會(huì)比較慢。尤其是在add方法執(zhí)行的過(guò)程中危号,如果當(dāng)前數(shù)組容量不足以容納元素牧愁,會(huì)進(jìn)行擴(kuò)容。所以外莲,在知道最大容量的情況下猪半,最好給它一個(gè)初始容量值兔朦。

Java集合(二)--ArrayList簡(jiǎn)析

LinkedList

LinkedList實(shí)現(xiàn)了Deque等接口,可以當(dāng)作雙端隊(duì)列來(lái)使用磨确。它是基于私有的內(nèi)部類Node完成的對(duì)數(shù)據(jù)的操作沽甥,而Node是一個(gè)雙向鏈表類型的類,所以LinkedList是基于雙向鏈表實(shí)現(xiàn)的乏奥。在Node中存儲(chǔ)著上個(gè)節(jié)點(diǎn)和下個(gè)節(jié)點(diǎn)的信息以及當(dāng)前節(jié)點(diǎn)的值摆舟。對(duì)于LinkedList來(lái)說(shuō),它的get和set方法執(zhí)行過(guò)程中邓了,會(huì)先將要操作的索引與(當(dāng)前鏈表長(zhǎng)度/2)做比較恨诱,以確定是從前往后遍歷鏈表還是從后往前遍歷鏈表,然后再執(zhí)行相關(guān)的操作骗炉。而add和remove方法中照宝,則是通過(guò)改變鏈表中節(jié)點(diǎn)指針的指向來(lái)完成操作。因此它是的特點(diǎn)是增刪塊句葵,改查慢厕鹃。LinkedList沒有大小限制,可以無(wú)限擴(kuò)容乍丈。

Java集合(四)--LinkedList簡(jiǎn)析

集合中剂碴,還有一種集合Vector,它是一個(gè)線程同步的集合诗赌。不過(guò)現(xiàn)在很少用它汗茄,現(xiàn)在不做具體分析了。之后铭若,我們還會(huì)將線程同步的集合類洪碳,到時(shí)候,再將它們做比較叼屠。

Set

Set是一種無(wú)序且唯一的元素集合瞳腌,對(duì)兩個(gè)元素的比較不是使用"=="而是使用"equals"。它包含HashSet镜雨、TreeSet即EnumSet等等嫂侍。

HashSet

HashSet是基于HashMap實(shí)現(xiàn)的,它的構(gòu)造函數(shù)的作用就是初始化一個(gè)HashMap對(duì)象荚坞。對(duì)其中元素的操作都是通過(guò)調(diào)用HashMap對(duì)應(yīng)的方法完成的挑宠。HashSet的元素就是底層HashMap的key,而底層HashMap的value是一個(gè)Object類型的PRESENT對(duì)象颓影。

Java集合(九)--基于Map實(shí)現(xiàn)的Set簡(jiǎn)析

LinkedHashSet

LinkedHashSet是HashSet的子類各淀,與其不同的是,LinkedHashSet維護(hù)了一個(gè)貫穿其所有條目的雙向鏈表诡挂,鏈表中的元素按照其插入順序排序碎浇,且LinkedHashSet是基于LinkedHashMap實(shí)現(xiàn)的临谱。

Java集合(九)--基于Map實(shí)現(xiàn)的Set簡(jiǎn)析

TreeSet

TreeSet是基于TreeMap實(shí)現(xiàn)的,內(nèi)部的元素通過(guò)其自然順序或者是構(gòu)建時(shí)傳入的Comparator進(jìn)行排序奴璃,它不支持null元素悉默。它的構(gòu)造方法就是實(shí)例化一個(gè)TreeMap對(duì)象,且對(duì)元素的操作都是通過(guò)調(diào)用TreeMap中的相關(guān)方法實(shí)現(xiàn)的苟穆。它的元素就是底層TreeMap的key抄课,而底層TreeMap的value是一個(gè)Object類型的PRESENT對(duì)象。

Java集合(九)--基于Map實(shí)現(xiàn)的Set簡(jiǎn)析

EnumSet

不同于上面的Set類雳旅,EnumSet不是基于Map實(shí)現(xiàn)的剖膳。它繼承了Enum類,實(shí)現(xiàn)了AbstractSet等接口岭辣。EnumSet中的所有元素必須來(lái)自單個(gè)枚舉類型,枚舉集在其內(nèi)部表示為位向量甸饱,即使用一個(gè)位表示一個(gè)元素的狀態(tài)沦童。它不允許有空值,但可以檢測(cè)是否有空值叹话。EnumSet元素按照在枚舉類中的枚舉常量的順序進(jìn)行排序偷遗,且在迭代過(guò)程中,不會(huì)出現(xiàn)fail-fast驼壶。

EnumSet是一個(gè)抽象類氏豌,以枚舉類中是否包含64個(gè)枚舉常量為分界線,EnumSet分別會(huì)實(shí)例化RegularEnumSet(小于等于64)和JumboEnumSet(大于64)兩種EnumSet的實(shí)現(xiàn)類的對(duì)象來(lái)進(jìn)行實(shí)際的操作热凹。在RegularEnumSet中使用long類型的elements泵喘,通過(guò)其二進(jìn)制表現(xiàn)形式上不同位的狀態(tài)來(lái)表述數(shù)據(jù)是否存儲(chǔ)。而JumboEnumSet則是維護(hù)了一個(gè)long類型的elements數(shù)組般妙,具體操作原理同RegularEnumSet類似纪铺。

Java集合(十一)--EnumSet簡(jiǎn)析

Map

Map是通過(guò)鍵值對(duì)的映射關(guān)系來(lái)存儲(chǔ)數(shù)據(jù)的,它包含HashMap碟渺、TreeMap及EnumMap等多個(gè)實(shí)現(xiàn)類鲜锚。

HashMap

HashMap中是一個(gè)基于拉鏈法實(shí)現(xiàn)的散列表,內(nèi)部由數(shù)組苫拍、鏈表和紅黑樹實(shí)現(xiàn)芜繁。其中,數(shù)組用來(lái)通過(guò)索引確定鍵值對(duì)的位置绒极,而鏈表和紅黑樹則用來(lái)保存數(shù)據(jù)骏令,包括key所對(duì)應(yīng)的hash值(進(jìn)過(guò)處理),key集峦、value和下個(gè)節(jié)點(diǎn)的地址伏社。HashMap通過(guò)容量和加載因子來(lái)確定是否對(duì)數(shù)組擴(kuò)容抠刺。其中,默認(rèn)初始容量為16(容量的增長(zhǎng)必須以2的次方式增長(zhǎng)摘昌,且小于1<<30)速妖,默認(rèn)加載因子為0.75。加載因子其實(shí)就是控制是時(shí)間換空間聪黎,還是空間換時(shí)間罕容。

HashMap在擴(kuò)容的時(shí)候,會(huì)判斷鏈表長(zhǎng)度稿饰,當(dāng)鏈表長(zhǎng)度為8的時(shí)候锦秒,會(huì)判斷是擴(kuò)容還是轉(zhuǎn)為紅黑樹結(jié)構(gòu)(判斷依據(jù)是數(shù)組長(zhǎng)度是否大于64)。而當(dāng)鏈表長(zhǎng)度小于6的時(shí)候喉镰,又會(huì)將紅黑樹轉(zhuǎn)換為鏈表旅择。

Java集合(五)--HashMap簡(jiǎn)析

LinkedHashMap

LinkedHashMap是HashMap的子類,與HashMap的不同的是它維護(hù)了一個(gè)貫穿其所有條目的雙向鏈表侣姆。它通過(guò)布爾屬性的accessOrder來(lái)決定迭代順序生真,true為訪問(wèn)順序,false為插入順序捺宗。他在使用put或get等方法時(shí)柱蟀,會(huì)判斷如果是按照訪問(wèn)順序排序,則會(huì)將剛剛操作的元素放到鏈表的尾部蚜厉,這樣就形成了一個(gè)簡(jiǎn)單的LRU长已。

Java集合(十)--LinkedHashMap簡(jiǎn)析

TreeMap

TreeMap是基于紅黑樹實(shí)現(xiàn)的,它的鍵根據(jù)自然順序或者是創(chuàng)建時(shí)傳入的Comparator進(jìn)行排序昼牛,其key應(yīng)該是實(shí)現(xiàn)了Comparable接口的對(duì)象术瓮。對(duì)其中的元素做增刪操作后,需要對(duì)元素做修正贰健,以保證還是紅黑樹結(jié)構(gòu)斤斧。

Java集合(六)--TreeMap簡(jiǎn)析

WeakHashMap

WeakHashMap是一個(gè)帶弱鍵的單鏈表的Map,與HashMap類似霎烙,他也是通過(guò)容量和加載因子來(lái)控制其擴(kuò)容撬讽。當(dāng)某個(gè)鍵不再正常使用的時(shí)候,對(duì)應(yīng)的鍵值對(duì)就會(huì)被移除悬垃。這種操作是通過(guò)ReferenceQueue和Reference完成的游昼。其原理為,當(dāng)WeakHashMap的某個(gè)鍵被GC時(shí)尝蠕,該鍵會(huì)被添加到queue中烘豌。然后,在執(zhí)行某個(gè)操作的過(guò)程中看彼,會(huì)先去刪除與queue中對(duì)應(yīng)的元素廊佩,接著再去執(zhí)行相應(yīng)的操作囚聚。

Java集合(七)--WeakHashMap簡(jiǎn)析

EnumMap

EnumMap是用于枚舉類型鍵的專用Map實(shí)現(xiàn)。其映射中的所有鍵必須來(lái)自創(chuàng)建映射時(shí)顯式或隱式指定的單個(gè)枚舉類型标锄,枚舉映射在內(nèi)部表示為數(shù)組顽铸。 EnumMap的鍵按其鍵的自然順序(枚舉常量的聲明順序)維護(hù),且在迭代過(guò)程中料皇,不會(huì)出現(xiàn)fail-fast谓松。EnumMap不允許使用空鍵,但是践剂,可以測(cè)試是否存在空鍵或刪除空鍵鬼譬,且允許空值。它內(nèi)部維護(hù)了keyUniverse和vals兩個(gè)數(shù)組逊脯。其中优质,keyUniverse數(shù)組中包含的元素,是指定的枚舉類型中所有的枚舉常量军洼。vals數(shù)組長(zhǎng)度與keyUniverse數(shù)組長(zhǎng)度相同盆赤,且EnumMap的鍵值對(duì)的映射是keyUniverse數(shù)組與vals數(shù)組中相同位置的元素的映射。

Java集合(八)--EnumMap簡(jiǎn)析

還有一個(gè)HashTable歉眷,它繼承自Dictionary類,是同步的颤枪,鍵值不可以為空『辜瘢現(xiàn)在一般不用了,等分析ConCurrentHashMap的時(shí)候會(huì)把它拿出來(lái)說(shuō)一說(shuō)畏纲。

Collections

這是一個(gè)為集合提供的工具類,可以為集合提供排序扇住、查找、替換及同步控制等輔助方法盗胀。比如艘蹋,上面提到的集合都可以使用Collections提供的SynchronizedXXX(XXX代表:Collection、List票灰、Set及Map)方法實(shí)現(xiàn)同步女阀。

好了,到此非同步的集合類就分析完成了屑迂。年底要做項(xiàng)目了浸策,博客先放一放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惹盼,一起剝皮案震驚了整個(gè)濱河市庸汗,隨后出現(xiàn)的幾起案子茫蛹,更是在濱河造成了極大的恐慌茉唉,老刑警劉巖宽气,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩憾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡枉昏,警方通過(guò)查閱死者的電腦和手機(jī)陈肛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凶掰,“玉大人燥爷,你說(shuō)我怎么就攤上這事∨尘剑” “怎么了前翎?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畅涂。 經(jīng)常有香客問(wèn)我港华,道長(zhǎng),這世上最難降的妖魔是什么午衰? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任立宜,我火速辦了婚禮,結(jié)果婚禮上臊岸,老公的妹妹穿的比我還像新娘橙数。我一直安慰自己,他們只是感情好帅戒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布灯帮。 她就那樣靜靜地躺著,像睡著了一般逻住。 火紅的嫁衣襯著肌膚如雪钟哥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天瞎访,我揣著相機(jī)與錄音腻贰,去河邊找鬼。 笑死扒秸,一個(gè)胖子當(dāng)著我的面吹牛播演,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伴奥,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼宾巍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了渔伯?” 一聲冷哼從身側(cè)響起顶霞,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后选浑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蓝厌,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年古徒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拓提。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隧膘,死狀恐怖代态,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情疹吃,我是刑警寧澤蹦疑,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站萨驶,受9級(jí)特大地震影響歉摧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腔呜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一叁温、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧核畴,春花似錦膝但、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至咖刃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憾筏,已是汗流浹背嚎杨。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氧腰,地道東北人枫浙。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像古拴,于是被迫代替她去往敵國(guó)和親箩帚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,922評(píng)論 0 13
  • 操作系統(tǒng)中 heap 和 stack 的區(qū)別 什么是基于注解的切面實(shí)現(xiàn) 什么是 對(duì)象/關(guān)系 映射集成模塊 什么是 ...
    城市里永遠(yuǎn)的學(xué)習(xí)者閱讀 752評(píng)論 0 49
  • Java集合框架 Java中封裝了許多常用的數(shù)據(jù)結(jié)構(gòu),稱為集合框架,可以有效組織數(shù)據(jù)是嗜,提高程序性能愈案。最初Java只...
    Steven1997閱讀 922評(píng)論 0 2
  • 昨日在高端英語(yǔ)啟蒙學(xué)習(xí)群里,大家討論到面對(duì)幾百個(gè)句子記憶的各種問(wèn)題鹅搪,好幾位媽媽都提到了用分類法進(jìn)行記憶站绪。...
    瞳小甜Rosie閱讀 144評(píng)論 0 2
  • 羊絨恢准,古代為貴族專屬的奢侈面料,不僅因?yàn)檫@種面料珍貴如黃金甫题,也因?yàn)樗拇┲拖醋o(hù)都非常講究馁筐。如今,“軟黃金”的純度...
    熠羊絨閱讀 2,112評(píng)論 0 0