Java中的HashMap的工作原理是什嗎?

來源:互聯網
上載者:User

標籤:更新   需要   put   shm   hash   pac   nsf   具體步驟   cap   

Java中的HashMap是以索引值對(key-value)的形式儲存元素的。HashMap需要一個hash函數,它使用hashCode()和equals()方法來向集合/從集合添加和檢索元素。當調用put()方法的時候,HashMap會計算key的hash值,然後把索引值對儲存在集合中合適的索引上。如果key已經存在了,value會被更新成新值。HashMap的一些重要的特性是它的容量(capacity),負載因子(load factor)和擴容極限(threshold resizing)。


hashmap是一個key-value索引值對的資料結構,從結構上來講在jdk1.8之前是用數組加鏈表的方式實現,jdk1.8加了紅/黑樹狀結構,hashmap數組的預設初始長度是16,hashmap數組只允許一個key為null,允許多個value為null
hashmap的內部實現,hashmap是使用數組+鏈表+紅/黑樹狀結構的形式實現的,其中數組是一個一個Node[]數組,我們叫他hash桶數組,它上面存放的是key-value索引值對的節點。HashMap是用hash表來儲存的,在hashmap裡為解決hash衝突,使用鏈地址法,簡單來說就是數組加鏈表的形式來解決,當資料被hash後,得到數組下標,把資料放在對應下表的鏈表中。
然後再說一下hashmap的方法實現
put方法,put方法的第一步,就是計算出要put元素在hash桶數組中的索引位置,得到索引位置需要三步,去put元素key的hashcode值,高位元運算,模數運算,高位元運算就是用第一步得到的值h,用h的高16位和低16位進行異或操作,第三步為了使hash桶數組元素分布更均勻,採用模數運算,模數運算就是用第二步得到的值和hash桶數組長度-1的值取與。這樣得到的結果和傳統模數運算結果一致,而且效率比模數運算高
jdk1.8中put方法的具體步驟,先判斷hashmap是否為空白,為空白的話擴容,不為空白計算出key的hash值i,然後看table[i]是否為空白,為空白就直接插入,不為空白判斷當前位置的key和table[i]是否相同,相同就覆蓋,不相同就查看table[i]是否是紅/黑樹狀結構節點,如果是的話就用紅/黑樹狀結構直接插入索引值對,如果不是開始遍曆鏈表插入,如果遇到重複值就覆蓋,否則直接插入,如果鏈表長度大於8,轉為紅/黑樹狀結構結構,執行完成後看size是否大於閾值threshold,大於就擴容,否則直接結束
get方法就是計算出要擷取元素的hash值,去對應位置取即可。
擴容機制,hashmap的擴容中主要進行兩部,第一步把數組長度變為原來的兩倍,第二部把舊數組的元素重新計算hash插入到新數組中,在jdk1.8時,不用重新計算hash,只用看看原來的hash值新增的一位是零還是1,如果是1這個元素在新數組中的位置,是原數組的位置加原數組長度,如果是零就插入到原數組中。擴容過程第二部一個非常重要的方法是transfer方法,採用頭插法,把舊數組的元素插入到新數組中。
3.hashmap大小為什麼是2的冪次方
在計算插入元素在hash桶數組的索引時第三步,為了使元素分布的更加均勻,用模數操作,但是傳統模數操作效率低,然後最佳化成h&(length-1),設定成2冪次方,是因為2的冪次方-1後的值每一位上都是1,然後與第二步計算出的h值與的時候,最終的結果只和key的hashcode值本身有關,這樣不會造成空間浪費並且分布均勻,如果不是2的冪次方
如果length不為2的冪,比如15。那麼length-1的2進位就會變成1110。在h為隨機數的情況下,和1110做&操作。尾數永遠為0。那麼0001、1001、1101等尾數為1的位置就永遠不可能被entry佔用。這樣會造成浪費,不隨機等問題。

Java中的HashMap的工作原理是什嗎?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.