面試必備:揭開(kāi)Java集合神秘面紗,HashMap、ArrayList等底層揭秘!

大家好,我是你們的小米小編,在這里我將為大家?guī)?lái)一場(chǎng)關(guān)于Java集合的底層實(shí)現(xiàn)的深度解析。作為面試題,對(duì)于HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList這五個(gè)常用的數(shù)據(jù)結(jié)構(gòu),我們一起來(lái)揭開(kāi)它們神秘的面紗,一起探索它們是如何在底層實(shí)現(xiàn)的吧!
HashMap
HashMap是Java中最常用的一種哈希表實(shí)現(xiàn)。它基于鍵(Key)-值(Value)對(duì)的存儲(chǔ)方式,通過(guò)哈希算法來(lái)保證元素的快速查找。
底層數(shù)據(jù)結(jié)構(gòu):數(shù)組+鏈表+紅黑樹(shù)(JDK 8及以上版本)
數(shù)組: HashMap的核心數(shù)據(jù)結(jié)構(gòu)是一個(gè)Entry數(shù)組,每個(gè)Entry對(duì)象包含一個(gè)鍵值對(duì),以及用于解決哈希沖突的鏈表或紅黑樹(shù)的指針。數(shù)組的初始大小是16(JDK 8及以上版本),每次擴(kuò)容都是當(dāng)前大小的2倍。
鏈表: 當(dāng)發(fā)生哈希沖突時(shí),即不同的鍵計(jì)算出相同的哈希值,新的Entry會(huì)被插入到數(shù)組對(duì)應(yīng)位置的鏈表中。
紅黑樹(shù): JDK 8及以上版本,在哈希沖突的鏈表長(zhǎng)度超過(guò)一定閾值(默認(rèn)為8),鏈表會(huì)轉(zhuǎn)化為紅黑樹(shù),以提高搜索效率。
LinkedHashMap
LinkedHashMap繼承自HashMap,除了具有HashMap的特性外,還能保持元素的插入順序。
底層數(shù)據(jù)結(jié)構(gòu):HashMap + 雙向鏈表
HashMap: LinkedHashMap內(nèi)部依然使用HashMap來(lái)存儲(chǔ)鍵值對(duì),維護(hù)著快速的查找能力。
雙向鏈表: 在HashMap的基礎(chǔ)上,LinkedHashMap引入了一個(gè)雙向鏈表來(lái)維護(hù)元素的插入順序。每次插入新元素時(shí),除了在HashMap中添加Entry,還會(huì)在雙向鏈表的尾部插入新的節(jié)點(diǎn)。
LinkedHashMap保持了鍵值對(duì)的添加順序,所以在遍歷時(shí),輸出的順序與添加順序相同。
ConcurrentHashMap
ConcurrentHashMap是為了在多線程環(huán)境下提供高效的并發(fā)性能而設(shè)計(jì)的集合類。
底層數(shù)據(jù)結(jié)構(gòu):數(shù)組+鏈表+紅黑樹(shù)(JDK 8及以上版本)
數(shù)組: 與HashMap類似,ConcurrentHashMap的底層也是一個(gè)Entry數(shù)組,每個(gè)Entry存儲(chǔ)一個(gè)鍵值對(duì)。
鏈表與紅黑樹(shù): 處理哈希沖突的方式與HashMap相同,通過(guò)鏈表或紅黑樹(shù)來(lái)解決沖突,提高查詢效率。
分段鎖: ConcurrentHashMap引入了“分段鎖”機(jī)制,將整個(gè)數(shù)據(jù)結(jié)構(gòu)劃分成多個(gè)小的Segment,每個(gè)Segment獨(dú)立地控制一部分?jǐn)?shù)據(jù)。這樣,在多線程環(huán)境下,不同線程可以同時(shí)訪問(wèn)不同的Segment,從而提高了并發(fā)性能。
ArrayList
ArrayList是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,它提供了快速的隨機(jī)訪問(wèn)能力。
底層數(shù)據(jù)結(jié)構(gòu):數(shù)組
數(shù)組: ArrayList的底層是一個(gè)Object類型的數(shù)組,默認(rèn)初始容量為10。每次擴(kuò)容時(shí),當(dāng)前容量會(huì)增加50%。
動(dòng)態(tài)擴(kuò)容: 當(dāng)元素?cái)?shù)量超過(guò)當(dāng)前數(shù)組容量時(shí),ArrayList會(huì)觸發(fā)擴(kuò)容操作,創(chuàng)建一個(gè)更大的數(shù)組,并將原有數(shù)據(jù)復(fù)制到新數(shù)組中。
LinkedList
LinkedList是基于雙向鏈表實(shí)現(xiàn)的,它提供了快速的插入和刪除能力。
底層數(shù)據(jù)結(jié)構(gòu):雙向鏈表
雙向鏈表: LinkedList的底層是一個(gè)雙向鏈表,每個(gè)節(jié)點(diǎn)包含元素值、前向指針和后向指針。
插入和刪除: 由于雙向鏈表的特性,插入和刪除操作非常高效,只需要調(diào)整節(jié)點(diǎn)的指針即可。
總結(jié)
通過(guò)本次深入解析,我們了解到了HashMap、LinkedHashMap、ConcurrentHashMap、ArrayList、LinkedList的底層實(shí)現(xiàn)原理。
HashMap和LinkedHashMap都使用數(shù)組+鏈表(或紅黑樹(shù))的數(shù)據(jù)結(jié)構(gòu),其中LinkedHashMap又額外引入了雙向鏈表來(lái)保持插入順序。
ConcurrentHashMap在保留HashMap特性的基礎(chǔ)上,通過(guò)分段鎖的機(jī)制提高了并發(fā)性能。
ArrayList是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),提供了快速的隨機(jī)訪問(wèn)能力。
LinkedList是基于雙向鏈表實(shí)現(xiàn),提供了快速的插入和刪除能力。
END
希望本篇文章能對(duì)大家理解這些數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)有所幫助。如果有任何疑問(wèn)或者更多想了解的話題,歡迎在評(píng)論區(qū)留言,我們下期再見(jiàn)!加油,一起探索更多有趣的技術(shù)知識(shí)!
如有疑問(wèn)或者更多的技術(shù)分享,歡迎關(guān)注我的微信公眾號(hào)“知其然亦知其所以然”!
