Java基礎(chǔ)-集合類-常用容器操作實現(xiàn)原理匯總

Java工程師知識樹 / Java基礎(chǔ)


常用容器操作實現(xiàn)原理匯總

ArrayList實現(xiàn)原理要點概括

ArrayList是List接口的可變數(shù)組非同步實現(xiàn)员寇,并允許包括null在內(nèi)的所有元素。
底層使用數(shù)組實現(xiàn) 陆爽。
該集合是可變長度數(shù)組扳缕,數(shù)組擴容時别威,會將老數(shù)組中的元素重新拷貝一份到新的數(shù)組中省古,每次數(shù)組容量增長大約是其容量的1.5倍仔拟,這種操作的代價很高。
若是能預(yù)估到頂峰容量科侈,可以設(shè)置一個足夠大的量以避免數(shù)組容量以后的擴展炒事。
采用了Fail-Fast機制,面對并發(fā)的修改時挠乳,迭代器很快就會完全失敗睡扬,而不是冒著在將來某個不確定時間發(fā)生任意不確定行為的風險 。
remove方法會讓下標到數(shù)組末尾的元素向前移動一個單位卖怜,并把最后一位的值置空马靠,方便GC 。
add逞度、remove操作對于ArrayList其運行時間是O(N)妙啃,因為在它當中在前端進行添加或移除構(gòu)造新數(shù)組是O(N)操作;get方法的調(diào)用為O(1)操作茁瘦。
要是使用一個增強的for循環(huán)储笑,對于任意List的運行時間都是O(N),因為迭代器將有效地從一項到下一項推進腔稀。

ArrayList實現(xiàn)原理詳細介紹


LinkedList實現(xiàn)原理要點概括

LinkedList是List接口的雙向鏈表非同步實現(xiàn)焊虏,并允許包括null在內(nèi)的所有元素。
底層的數(shù)據(jù)結(jié)構(gòu)是基于雙向鏈表的炼团,該數(shù)據(jù)結(jié)構(gòu)我們稱為節(jié)點疏尿。
雙向鏈表節(jié)點對應(yīng)的類Node的實例,Node中包含成員變量:prev锌俱,next敌呈,item磕洪。
其中,prev是該節(jié)點的上一個節(jié)點鲫咽,next是該節(jié)點的下一個節(jié)點叫榕,item是該節(jié)點所包含的值姊舵。
它的查找是分兩半查找括丁,先判斷index是在鏈表的哪一半,然后再去對應(yīng)區(qū)域查找尖昏,這樣最多只要遍歷鏈表的一半節(jié)點即可找到 构资。
add、remove操作對于LinkedList其運行時間是O(1)迹淌;get方法的調(diào)用為O(N)操作。
要是使用一個增強的for循環(huán)耙饰,對于任意List的運行時間都是O(N)纹份,因為迭代器將有效地從一項到下一項推進蔓涧。

LinkedList實現(xiàn)原理詳細介紹


HashMap實現(xiàn)原理要點概括

HashMap是基于哈希表的Map接口的非同步實現(xiàn),允許使用null值和null鍵拨齐,但不保證映射的順序昨寞。
底層使用數(shù)組實現(xiàn)援岩,數(shù)組中每一項是個單向鏈表,即數(shù)組和鏈表的結(jié)合體羽峰;當鏈表長度大于一定閾值時添瓷,鏈表轉(zhuǎn)換為紅黑樹,這樣減少鏈表查詢時間坯汤。
HashMap在底層將key-value當成一個整體進行處理惰聂,這個整體就是一個Node對象咱筛。
HashMap底層采用一個Node[]數(shù)組來保存所有的key-value對,當需要存儲一個Node對象時溉愁,會根據(jù)key的hash算法來決定其在數(shù)組中的存儲位置饲趋,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置;當需要取出一個Node時投队,也會根據(jù)key的hash算法找到其在數(shù)組中的存儲位置敷鸦,再根據(jù)equals方法從該位置上的鏈表中取出該Node。
HashMap進行數(shù)組擴容需要重新計算擴容后每個元素在數(shù)組中的位置值依,很耗性能。
采用了Fail-Fast機制漾脂,通過一個modCount值記錄修改次數(shù)辆亏,對HashMap內(nèi)容的修改都將增加這個值鳖目。
迭代器初始化過程中會將這個值賦給迭代器的expectedModCount领迈,在迭代過程中,判斷modCount跟expectedModCount是否相等衷蜓,如果不相等就表示已經(jīng)有其他線程修改了Map尘喝,馬上拋出異常瞧省。

HashMap解決沖突的方式是鏈地址法,詳情可參考文章Java基礎(chǔ)-集合類-哈希鳍贾,HashMap通過鍵對象的equals()方法用來找到鍵以及對應(yīng)的值的骑科。如果鏈表大小超過閾值(TREEIFY_THRESHOLD, 8),鏈表就會被改造為樹形結(jié)構(gòu)梁棠。

HashMap實現(xiàn)原理詳細介紹


Hashtable實現(xiàn)原理要點概括

Hashtable是基于哈希表的Map接口的同步實現(xiàn)置森,不允許使用null值和null鍵。
底層使用數(shù)組實現(xiàn)符糊,數(shù)組中每一項是個單鏈表凫海,即數(shù)組和鏈表的結(jié)合體。
Hashtable在底層將key-value當成一個整體進行處理男娄,這個整體就是一個Entry對象行贪。
Hashtable底層采用一個Entry[]數(shù)組來保存所有的key-value對,當需要存儲一個Entry對象時模闲,會根據(jù)key的hash算法來決定其在數(shù)組中的存儲位置建瘫,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置;當需要取出一個Entry時尸折,也會根據(jù)key的hash算法找到其在數(shù)組中的存儲位置啰脚,再根據(jù)equals方法從該位置上的鏈表中取出該Entry实夹。
synchronized是針對整張Hash表的橄浓,即每次鎖住整張表讓線程獨占。

Hashtable實現(xiàn)原理詳細介紹


HashSet實現(xiàn)原理要點概括

HashSet由哈希表(實際上是一個HashMap實例)支持亮航,不保證set的迭代順序贮配,并允許使用null元素。
基于HashMap實現(xiàn)塞赂,API也是對HashMap的行為進行了封裝泪勒,可參考HashMap。

HashSet實現(xiàn)原理詳細介紹


LinkedHashMap實現(xiàn)原理要點概括

LinkedHashMap繼承于HashMap宴猾,底層使用哈希表和雙向鏈表來保存所有元素圆存,并且它是非同步,允許使用null值和null鍵仇哆。
基本操作與父類HashMap相似沦辙,通過重寫HashMap相關(guān)方法,重新定義了數(shù)組中保存的元素Entry讹剔,來實現(xiàn)自己的鏈接列表特性油讯。
該Entry除了保存當前對象的引用外,還保存了其上一個元素before和下一個元素after的引用延欠,從而構(gòu)成了雙向鏈接列表陌兑。

LinkedHashMap實現(xiàn)原理詳細介紹


LinkedHashSet實現(xiàn)原理要點概括

對于LinkedHashSet而言,它繼承與HashSet由捎、又基于LinkedHashMap來實現(xiàn)的兔综。LinkedHashSet底層使用LinkedHashMap來保存所有元素,它繼承與HashSet,其所有的方法操作上又與HashSet相同软驰。

LinkedHashSet實現(xiàn)原理詳細介紹


ConcurrentHashMap實現(xiàn)原理要點概括

ConcurrentHashMap允許多個修改操作并發(fā)進行涧窒,其關(guān)鍵在于使用了鎖分離技術(shù)。
它使用了多個鎖來控制對hash表的不同段進行的修改锭亏,每個段其實就是一個小的hashtable纠吴,它們有自己的鎖。
只要多個并發(fā)發(fā)生在不同的段上慧瘤,它們就可以并發(fā)進行呜象。
ConcurrentHashMap在底層將key-value當成一個整體進行處理,這個整體就是一個Entry對象碑隆。
Hashtable底層采用一個Entry[]數(shù)組來保存所有的key-value對恭陡,當需要存儲一個Entry對象時,會根據(jù)key的hash算法來決定其在數(shù)組中的存儲位置上煤,在根據(jù)equals方法決定其在該數(shù)組位置上的鏈表中的存儲位置休玩;當需要取出一個Entry時,也會根據(jù)key的hash算法找到其在數(shù)組中的存儲位置劫狠,再根據(jù)equals方法從該位置上的鏈表中取出該Entry拴疤。
與HashMap不同的是,ConcurrentHashMap使用多個子Hash表独泞,也就是段(Segment) ConcurrentHashMap完全允許多個讀操作并發(fā)進行呐矾,讀操作并不需要加鎖。
如果使用傳統(tǒng)的技術(shù)懦砂,如HashMap中的實現(xiàn)蜒犯,如果允許可以在hash鏈的中間添加或刪除元素,讀操作不加鎖將得到不一致的數(shù)據(jù)荞膘。
ConcurrentHashMap實現(xiàn)技術(shù)是保證HashEntry幾乎是不可變的罚随。

ConcurrentHashMap實現(xiàn)原理詳細介紹


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市羽资,隨后出現(xiàn)的幾起案子淘菩,更是在濱河造成了極大的恐慌,老刑警劉巖屠升,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潮改,死亡現(xiàn)場離奇詭異,居然都是意外死亡腹暖,警方通過查閱死者的電腦和手機汇在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來微服,“玉大人趾疚,你說我怎么就攤上這事∫栽蹋” “怎么了糙麦?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丛肮。 經(jīng)常有香客問我赡磅,道長,這世上最難降的妖魔是什么宝与? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任焚廊,我火速辦了婚禮,結(jié)果婚禮上习劫,老公的妹妹穿的比我還像新娘咆瘟。我一直安慰自己,他們只是感情好诽里,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布袒餐。 她就那樣靜靜地躺著,像睡著了一般谤狡。 火紅的嫁衣襯著肌膚如雪灸眼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天墓懂,我揣著相機與錄音焰宣,去河邊找鬼。 笑死捕仔,一個胖子當著我的面吹牛匕积,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播榜跌,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闸天,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了斜做?” 一聲冷哼從身側(cè)響起苞氮,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓤逼,沒想到半個月后笼吟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡霸旗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年贷帮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诱告。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撵枢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锄禽,我是刑警寧澤潜必,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站沃但,受9級特大地震影響磁滚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宵晚,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一垂攘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淤刃,春花似錦晒他、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至耕陷,卻和暖如春掂名,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哟沫。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工饺蔑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗜诀。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓猾警,卻偏偏與公主長得像,于是被迫代替她去往敵國和親隆敢。 傳聞我的和親對象是個殘疾皇子发皿,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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