漫畫:什麼是HashMap?(底層原理)
轉自:程式設計師小灰(微訊號:chengxuyuanxiaohui)
————————————
眾所周知,HashMap是一個用於儲存Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散儲存在一個陣列當中,這個陣列就是HashMap的主幹。
HashMap陣列每一個元素的初始值都是Null。
對於HashMap,我們最常使用的是兩個方法:Get 和 Put。
1、Put方法的原理
呼叫Put方法的時候發生了什麼呢?
比如呼叫 hashMap.put(“apple”, 0) ,插入一個Key為“apple"的元素。這時候我們需要利用一個雜湊函式來確定Entry的插入位置(index):
index = Hash(“apple”)
假定最後計算出的index是2,那麼結果如下:
但是,因為HashMap的長度是有限的,當插入的Entry越來越多時,再完美的Hash函式也難免會出現index衝突的情況。比如下面這樣:
這時候該怎麼辦呢?我們可以利用連結串列來解決。
HashMap陣列的每一個元素不止是一個Entry物件,也是一個連結串列的頭節點。每一個Entry物件透過Next指標指向它的下一個Entry節點。當新來的Entry對映到衝突的陣列位置時,只需要插入到對應的連結串列即可:
需要注意的是,新來的Entry節點插入連結串列時,使用的是“頭插法”。至於為什麼不插入連結串列尾部,後面會有解釋。
2、Get方法的原理
使用Get方法根據Key來查詢Value的時候,發生了什麼呢?
首先會把輸入的Key做一次Hash對映,得到對應的index:
index = Hash(“apple”)
由於剛才所說的Hash衝突,同一個位置有可能匹配到多個Entry,這時候就需要順著對應連結串列的頭節點,一個一個向下來查詢。假設我們要查詢的Key是“apple”:
第一步,我們檢視的是頭節點Entry6,Entry6的Key是banana,顯然不是我們要找的結果。
第二步,我們檢視的是Next節點Entry1,Entry1的Key是apple,正是我們要找的結果。
之所以把Entry6放在頭節點,是因為HashMap的發明者認為,後插入的Entry被查詢的可能性更大。
3、HashMap的初始長度
之前說過,從Key對映到HashMap陣列的對應位置,會用到一個Hash函式:
index = Hash(“apple”)
如何實現一個儘量均勻分佈的Hash函式呢?我們透過利用Key的HashCode值來做某種運算。
index = HashCode(Key) % Length ?
如何進行位運算呢?有如下的公式(Length是HashMap的長度):
index = HashCode(Key) & (Length - 1)
下面我們以值為“book”的Key來演示整個過程:
1.計算book的hashcode,結果為十進位制的3029737,二進位制的101110001110101110 1001。
2.假定HashMap長度是預設的16,計算Length-1的結果為十進位制的15,二進位制的1111。
3.把以上兩個結果做與運算,101110001110101110 1001 & 1111 = 1001,十進位制是9,所以 index=9。
可以說,Hash演算法最終得到的index結果,完全取決於Key的Hashcode值的最後幾位。
假設HashMap的長度是10,重複剛才的運算步驟:
單獨看這個結果,表面上並沒有問題。我們再來嘗試一個新的HashCode 101110001110101110 1011:
讓我們再換一個HashCode 101110001110101110 1111 試試:
是的,雖然HashCode的倒數第二第三位從0變成了1,但是運算的結果都是1001。也就是說,當HashMap長度為10的時候,有些index結果的出現機率會更大,而有些index結果永遠不會出現(比如0111)!
這樣,顯然不符合Hash演算法均勻分佈的原則。
反觀長度16或者其他2的冪,Length-1的值是所有二進位制位全為1,這種情況下,index的結果等同於HashCode後幾位的值。只要輸入的HashCode本身分佈均勻,Hash演算法的結果就是均勻的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69947338/viewspace-2656367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HashMap原理底層剖析HashMap
- HashMap的底層原理HashMap
- HashMap底層實現原理HashMap
- HashMap的底層原理分析HashMap
- 漫畫:什麼是機器學習機器學習
- 深度解析HashMap集合底層原理HashMap
- 漫畫版:什麼是機器學習?機器學習
- 面試官問:為什麼HashMap底層樹化的元素是 8面試HashMap
- 漫畫:什麼是氣泡排序?排序
- 漫畫:什麼是計數排序?排序
- 漫畫:什麼是單例模式?單例模式
- 漫畫 | 什麼是區塊鏈?區塊鏈
- 漫畫:什麼是大資料?大資料
- 漫畫:什麼是架構師架構
- 漫畫:什麼是人工智慧人工智慧
- HashMap原理(一) 概念和底層架構HashMap架構
- 漫畫版:什麼是深度學習?深度學習
- 漫畫版:什麼是人工智慧?人工智慧
- 漫畫:什麼是LRU演算法?演算法
- 漫畫:容器技術docker是什麼?Docker
- 漫畫:什麼是動態規劃?動態規劃
- 最通俗易懂搞定HashMap的底層原理HashMap
- 面試必問:HashMap 底層實現原理分析面試HashMap
- HashMap底層實現原理/HashMap與HashTable區別/HashMap與HashSet區別HashMap
- 漫畫版:什麼是神經網路?神經網路
- 漫畫演算法:什麼是 B 樹?演算法
- HashMap的底層結構、原理、擴容機制HashMap
- Java進階:HashMap底層原理(通俗易懂篇)JavaHashMap
- 漫畫 | 程式設計師的悲哀是什麼?程式設計師
- 用漫畫的形式展現——什麼是webWeb
- 漫畫演算法:什麼是跳躍表?演算法
- HashMap的實現原理 HashMap底層實現,hashCode如何對應bucket?HashMap
- Python是什麼語言?Python底層語言是什麼?Python
- 漫畫 | 到底是什麼讓IT人如此苦逼???
- 序列化和反序列化的底層實現原理是什麼?
- 漫畫演算法:輾轉相除法是什麼鬼?演算法
- OC底層探索(十六) KVO底層原理
- synchronized底層原理synchronized