欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 8中HashMap的底層原理解析

 更新時間:2023年11月23日 14:52:12   作者:zhuhai0613  
HashMap作為Java中常用的數(shù)據(jù)結構之一,在JDK 1.8中經過了一系列的優(yōu)化和改進,深入理解其底層原理,包括哈希算法、數(shù)組與鏈表結構、紅黑樹的引入等,有助于更好地使用和理解HashMap的性能特性,這篇文章主要介紹了Java 8中HashMap的底層原理,需要的朋友可以參考下

引言

HashMap是Java中常用的集合類,用于存儲鍵值對。其底層實現(xiàn)經過多次優(yōu)化,包括哈希算法、數(shù)組擴容、鏈表轉紅黑樹等。本文將深入研究HashMap的底層原理,并詳細探討如何解決哈希碰撞的技術。

1. 哈希算法

HashMap的核心是哈希算法,它通過將鍵的哈希碼映射到數(shù)組索引,實現(xiàn)快速的數(shù)據(jù)查找和插入。在JDK 1.8中,哈希算法經過了一些優(yōu)化,以提高均勻性和減少碰撞的可能性。

2. 數(shù)組與鏈表結構

HashMap的底層數(shù)據(jù)結構是一個數(shù)組,每個數(shù)組元素是一個鏈表(或紅黑樹)。當多個鍵映射到相同的索引位置時,它們將被存儲在同一個鏈表中。為了解決哈希碰撞,鏈表中存儲的是一個個鍵值對。

3. 鍵值對的存儲

HashMap中,鍵值對以Node對象的形式存儲。每個Node包含鍵、值、哈希碼以及指向下一個Node的引用。當產生哈希沖突時,新的Node將被添加到鏈表的末尾。

4. 解決哈希碰撞的方法

鏈地址法:當發(fā)生哈希沖突時,將沖突的元素以鏈表的形式鏈接在一起,同一個鏈表上的元素哈希值相同。

紅黑樹:當鏈表長度超過一定閾值(默認為8)時,鏈表會轉換為紅黑樹,可以減少查找時間。因為紅黑樹的時間復雜度為O(logn),而鏈表為O(n)。

擴容rehash:當HashMap中的元素數(shù)量太多,超過數(shù)組大小*加載因子時,會發(fā)生擴容。擴容后,需要對原數(shù)組中的所有元素重新計算哈希值,然后放到新的擴容后的數(shù)組中,這樣可以增加鏈表長度,減少哈希沖突。

優(yōu)化哈希算法:JDK 1.8中優(yōu)化了哈希算法,通過hashCode()的高16位異或低16位實現(xiàn)的:(h = k.hashCode()) ^ (h >>> 16),提高了哈希碰撞分布性。

所以Java 8中HashMap主要通過鏈地址法+紅黑樹+擴容rehash+優(yōu)化哈希算法來解決哈希沖突。這些方法相結合可以有效地解決哈希沖突問題,提高HashMap的性能。

5. 數(shù)組擴容機制

HashMap中的元素數(shù)量超過容量乘以加載因子時,數(shù)組會被擴容。在JDK 1.8中,默認加載因子是0.75。擴容涉及到重新計算哈希碼、重新分配數(shù)組,并將現(xiàn)有元素重新放置到新的數(shù)組中。這確保了HashMap的性能和空間的平衡。

6. 紅黑樹的引入

為了應對鏈表過長的情況,JDK 1.8引入了紅黑樹。當鏈表長度達到8時,鏈表將被轉換為紅黑樹,以提高查找效率。紅黑樹的引入使得在最壞情況下,查找時間復雜度從O(n)降低到O(log n)。

為什么當鏈表長度達到8時,鏈表將被轉換為紅黑樹,又為什么紅黑樹轉鏈表的閾值為6?
首先和hashcode碰撞次數(shù)的泊松分布有關,主要是為了實現(xiàn)時間和空間的平衡,在負載因子為0.75默認情況下,單個hash槽內元素個數(shù)為8的概率小于百萬分之一,將7作為一個分水嶺,等于7時不做轉換,大于等于8才轉紅黑樹,小于等于6才轉鏈表,鏈表中元素個數(shù)為8時的概率已經非常小,再多的就更少了,所以原作者在選擇鏈表元素個數(shù)時選擇了8,是根據(jù)概率統(tǒng)計而選擇的,紅黑樹中的TreeNode,是鏈表中的Node所占空間的2倍,雖然紅黑樹的查找效率為o(logN),要優(yōu)于鏈表的o(N),但是當鏈表長度比較小的時候,即使全部遍歷,時間復雜度也不會太高,所以,要尋找一種時間和空間的平衡,即在鏈表長度達到一個閾值,之后再轉換為紅黑樹,之所以是8,是因為Java的源碼貢獻者,在進行大量實驗發(fā)現(xiàn),hash碰撞發(fā)生8次的概率,已經降低到了0.00000006,幾乎為不可能事件,如果真的碰撞發(fā)生了8次,那么這個時候說明由于元素,本身和hash函數(shù)的原因,此次操作的hash碰撞的可能性非常大了,后序可能還會繼續(xù)發(fā)生hash碰撞,所以,這個時候,就應該將鏈表轉換為紅黑樹了,也就是為什么鏈表轉紅黑樹的閾值是8;
最后,紅黑樹轉鏈表的閾值為6,主要是因為:如果也將該閾值設置于8,那么當hash碰撞在8時,會反生鏈表和紅黑樹的不停相互激蕩轉換,白白浪費資源。

7. 在Java 8中的實現(xiàn)細節(jié)

在JDK 1.8中,HashMap的實現(xiàn)經過了優(yōu)化,包括更好的哈希算法、紅黑樹的引入、鏈表長度的控制等。這些變化使得HashMap在面對各種情況時都能提供高效的性能。

8. 性能優(yōu)化與注意事項

在使用HashMap時,需要注意一些性能優(yōu)化的問題,例如合理選擇初始容量和加載因子、避免頻繁擴容等。對于特定的應用場景,可以通過調整這些參數(shù)來達到更好的性能。

結論

HashMap作為Java中常用的數(shù)據(jù)結構之一,在JDK 1.8中經過了一系列的優(yōu)化和改進。深入理解其底層原理,包括哈希算法、數(shù)組與鏈表結構、紅黑樹的引入等,以及如何解決哈希碰撞的技術,有助于更好地使用和理解HashMap的性能特性。在實際應用中,根據(jù)具體場景選擇適當?shù)膮?shù),可以更好地發(fā)揮HashMap的優(yōu)勢,提高程序的性能和效率。

到此這篇關于Java 8中HashMap的底層原理的文章就介紹到這了,更多相關Java 8 HashMap原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現(xiàn)文本查重的方法詳解

    Java實現(xiàn)文本查重的方法詳解

    Ansj 是一個開源的 Java 中文分詞工具,基于中科院的 ictclas 中文分詞算法,采用隱馬爾科夫模型(HMM),比其他常用的開源分詞工具(如 MMseg4j)的分詞準確率更高,下面我們就來使用它實現(xiàn)文本查重功能吧
    2024-04-04
  • java實現(xiàn)單鏈表中是否有環(huán)的方法詳解

    java實現(xiàn)單鏈表中是否有環(huán)的方法詳解

    本篇文章介紹了,用java實現(xiàn)單鏈表中是否有環(huán)的方法詳解。需要的朋友參考下
    2013-05-05
  • 詳解如何通過Java實現(xiàn)壓縮PDF文檔

    詳解如何通過Java實現(xiàn)壓縮PDF文檔

    PDF文檔是我們日常辦公中使用最頻繁的文檔格式。但因為大多數(shù)PDF文檔都包含很多頁面圖像或大量圖片,這就導致PDF文檔過大,處理起來較為麻煩。本文將介紹如何通過Java應用程序壓縮PDF文檔,需要的可以了解一下
    2022-12-12
  • MyBatis Plus復合主鍵問題的解決

    MyBatis Plus復合主鍵問題的解決

    在數(shù)據(jù)庫設計中,有時候需要使用復合主鍵來唯一標識表中的一行數(shù)據(jù),本文將為您詳細介紹MyBatis Plus中復合主鍵的問題以及解決方案,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • java集合框架 arrayblockingqueue應用分析

    java集合框架 arrayblockingqueue應用分析

    ArrayBlockingQueue是一個由數(shù)組支持的有界阻塞隊列。此隊列按 FIFO(先進先出)原則對元素進行排序。隊列的頭部 是在隊列中存在時間最長的元素
    2012-11-11
  • 深入分析@Resource和@Autowired注解區(qū)別

    深入分析@Resource和@Autowired注解區(qū)別

    這篇文章主要為大家介紹了深入分析@Resource和@Autowired注解區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • springboot實現(xiàn)rabbitmq消息確認的示例代碼

    springboot實現(xiàn)rabbitmq消息確認的示例代碼

    RabbitMQ的消息確認有兩種, 一種是消息發(fā)送確認,第二種是消費接收確認,本文主要介紹了springboot實現(xiàn)rabbitmq消息確認的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 微信公眾號開發(fā)消息推送功能

    微信公眾號開發(fā)消息推送功能

    微信公眾號分為服務號、訂閱號、企業(yè)號,訂閱號可以個人申請,服務號和企業(yè)號要有企業(yè)資質才可以,這篇文章主要介紹了微信公眾號開發(fā)消息推送功能,需要的朋友可以參考下
    2023-02-02
  • SpringBoot 接口開發(fā)教程(httpclient客戶端)

    SpringBoot 接口開發(fā)教程(httpclient客戶端)

    這篇文章主要介紹了SpringBoot 接口開發(fā)教程(httpclient客戶端),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java數(shù)組優(yōu)點和缺點_動力節(jié)點Java學院整理

    Java數(shù)組優(yōu)點和缺點_動力節(jié)點Java學院整理

    本文給大家簡單介紹下java數(shù)組的優(yōu)點和缺點知識,需要的的朋友參考下吧
    2017-04-04

最新評論