我是🌟廖志偉🌟,一名🌕Java開發工程師🌕、📝Java領域優質創作者📝、🎉CSDN博客專家🎉、🌹幕后大佬社區創始人🌹。擁有多年一線研發經驗,研究過各種常見框架及中間件的底層源碼,對於大型分布式、微服務、三高架構(高性能、高並發、高可用)有過實踐架構經驗。
🍊博主:java_wxid
🍊博主:Java廖志偉
🍊社區:幕后大佬
文章目錄
本文的大概內容:
HashMap底層數據結構
HashMap中數據存儲的結構是數組+鏈表/紅黑樹
- 數組作為基礎的數據存儲結構。
- 鏈表是為了解決hash碰撞問題,可參考【HashMap底層原理】。
- 紅黑樹是為了解決鏈表中的數據較多(滿足鏈表長度超過8,數組長度大於64,才會將鏈表替換成紅黑樹才會樹化)時效率下降的問題。
因為對於搜索,插入,刪除操作多的情況下,使用紅黑樹的效率要高一些。
紅黑樹是一種特殊的二叉查找樹,二叉查找樹所有節點的左子樹都小於該節點,所有節點的右子樹都大於該節點,就可以通過大小比較關系來進行快速的檢索。
在紅黑樹上插入或者刪除一個節點之后,紅黑樹就發生了變化,當它不再是紅黑樹時,可以通過左旋和右旋,保證每次插入或者刪除操作最多只需要三次旋轉就能達到平衡。
因為紅黑樹強制約束了從根到葉子的最長的路徑不多於最短的路徑的兩倍長,插入、刪除和查找某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的。
為什么是使用紅黑樹而不是AVL樹?
CurrentHashMap中是加鎖了的,實際上是讀寫鎖,如果寫沖突就會等待,如果插入時間過長必然等待時間更長,而紅黑樹相對AVL樹他的插入更快!在AVL樹中,從根到任何葉子的最短路徑和最長路徑之間的差異最多為1。在紅黑樹中,差異可以是2倍。
在AVL樹中查找通常更快,但這是以更多旋轉操作導致更慢的插入和刪除為代價的,紅黑樹在添加,刪除,查找相對較好。
那為什么HashMap不直接使用紅黑樹代替鏈表呢?
樹的節點占的空間是普通節點的兩倍,在節點足夠多的時候才會使用樹形數據結構,如果節點變少了還是會變回普通節點。所以節點太少的時候沒必要轉換、不僅轉換后的數據結構占空間而且轉換也需要花費時間。
在HashMap源碼有這樣一段描述,在使用分布良好的哈希代碼時,很少使用樹狀容器。理想情況下,在隨機散列碼下,箱中節點的頻率遵循泊松分布,默認大小調整閾值為0.75。
在理想狀態下受隨機分布的hashCode影響,鏈表中的節點遵循泊松分布,鏈表中的節點數是8的概率已經接近千分之一且此時鏈表的性能已經很差,所以在這種比較罕見的和極端的情況下才會把鏈表轉變為紅黑樹,大部分情況下HashMap還是使用鏈表,如果理想的均勻分布節點數不到8就已經自動擴容了。
總結
以上就是今天要講的內容,還希望各位讀者大大能夠在評論區積極參與討論,給文章提出一些寶貴的意見或者建議📝,合理的內容,我會采納更新博文,重新分享給大家。
🙏四連 關注🔎點贊👍收藏⭐️留言📝
感謝大家的支持,用心寫博文分享給大家,你的支持(🔎點贊👍收藏⭐️留言📝)是對我創作的最大幫助。
🍊微信公眾號:南北踏塵
🍊主頁地址:java_wxid
🍊社區地址:幕后大佬
給讀者大大的話
我本身是一個很普通的程序員,放在人堆里,除了與生俱來的🌹盛世美顏🌹、所剩不多的發量,就剩下180的大高個了。就是我這樣的一個人,默默堅持寫博文也有好多年了,有句老話說的好,🌕牛逼之前都是傻逼式的堅持🌕。希望自己可以通過大量的作品,時間的積累,個人魅力、運氣和時機,可以打造屬於自己的🌟技術影響力🌟。同時也希望自己可以成為一個🎄懂技術🎄,🎄懂業務🎄,🎄懂管理🎄的綜合型人才,作為項目架構路線的總設計師,掌控全局的🌕團隊大腦🌕,技術團隊中的🍊絕對核心🍊是我未來幾年不斷前進的目標。
提示:以下都是資源分享,求個一鍵三連。
面試資料
福利大放送,🎉歡迎關注🔎點贊👍收藏⭐️留言📝,拜托了🙏,這對我真的很重要。
點擊:面試資料
提取碼:2021
200套PPT模板
福利大放送,🎉歡迎關注🔎點贊👍收藏⭐️留言📝,拜托了🙏,這對我真的很重要。
點擊:200套PPT模板
提取碼:2021
提問的智慧
福利大放送,🎉歡迎關注🔎點贊👍收藏⭐️留言📝,拜托了🙏,這對我真的很重要。
點擊:提問的智慧
提取碼:2021
Java開發學習路線
名稱 | 鏈接 |
---|---|
JavaSE | 點擊: JavaSE |
MySQL專欄 | 點擊: MySQL專欄 |
JDBC專欄 | 點擊: JDBC專欄 |
MyBatis專欄 | 點擊: MyBatis專欄 |
Web專欄 | 點擊: Web專欄 |
Spring專欄 | 點擊: Spring專欄 |
SpringMVC專欄 | 點擊: SpringMVC專欄 |
SpringBoot專欄 | 點擊: SpringBoot專欄 |
SpringCould專欄 | 點擊: SpringCould專欄 |
Redis專欄 | 點擊: Redis專欄 |
Linux專欄 | 點擊: Linux專欄 |
Maven3專欄 | 點擊: Maven3專欄 |
Spring Security5專欄 | 點擊: Spring Security5專欄 |
更多專欄 | 更多專欄,請到 java_wxid主頁 查看 |
P5學習路線圖
P6學習路線圖
P7學習路線圖
P8學習路線圖
以上四張圖詳細介紹了作為Java開發工作者所需要具備的知識技能,同學們學廢了嘛,有想法系統學習的同學可以私聊我,🎉歡迎關注🔎點贊👍收藏⭐️留言📝。
🍊博主:java_wxid
🍊博主:Java廖志偉
🍊社區:幕后大佬