HashMap中的hash演算法總結

2021-10-05 07:56:32 字數 1213 閱讀 7178

演算法一直是我的弱項,然而面試中基本是必考的專案,剛好上次看到乙個hashmap的面試題,今天也來學習下 hashmap中的hash演算法是如何實現的。

數學知識回顧

hashmap中的hash演算法

首先要明白乙個概念,hashmap中定位到桶的位置 是根據key的hash值與陣列的長度取模來計算的。

具體的細節我就不說了,預設認為大家都懂這一點。

取模可以改為:hashcode & (length - 1)

看下jdk8中的hash 演算法:

static final int hash(object key)

首先是取key的hashcode演算法,然後對16進行異或運算和右移運算。

在分析上面異或運算和右移運算問題之前,我們需要先看看另乙個事情,什麼呢?就是 hashmap 如何根據 hash 值找到陣列種的物件,我們看看 get 方法的**:

final nodegetnode(int hash, object key)  while ((e = e.next) != null);}}

return null;

}

我們看看**中注釋下方的一行**:first = tab[(n - 1) & hash])。

使用陣列長度減一 與運算 hash 值。這行**就是為什麼要讓前面的 hash 方法移位並異或。

** 我們分析一下:**

首先,假設有一種情況,物件 a 的 hashcode 為 1000010001110001000001111000000,物件 b 的 hashcode 為 0111011100111000101000010100000。

如果陣列長度是16,也就是 15 與運算這兩個數(前面說的hashcode & (length - 1)), 你會發現結果都是0。這樣的雜湊結果太讓人失望了。很明顯不是乙個好的雜湊演算法。

但是如果我們將 hashcode 值右移 16 位,也就是取 int 型別的一半,剛好將該二進位制數對半切開。並且使用位異或運算(如果兩個數對應的位置相反,則結果為1,反之為0),這樣的話,就能避免我們上面的情況的發生。簡而言之就是盡量打亂hashcode的低16位,因為真正參與運算的還是低16位。

不知道這種解釋是否是簡單明瞭,經過自己的思考和分析後 也明白了 這段**設計的初衷,也會感嘆設計者的精妙。

HashMap中的hash演算法總結

演算法一直是我的弱項,然而面試中基本是必考的專案,剛好上次看到乙個hashmap的面試題,今天也來學習下 hashmap中的hash演算法是如何實現的。數學知識回顧 hashmap中的hash演算法 首先要明白乙個概念,hashmap中定位到桶的位置 是根據key的hash值與陣列的長度取模來計算的...

Hash演算法以及HashMap的一些小知識

hash演算法 至 雜湊表,又叫雜湊表,它是基於快速訪問的角度設計的,也是一種典型的 空間換時間 的做法。顧名思義,該資料結構可以理解為乙個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。...

從hash表到hashMap的理解

jdk1.7陣列 鍊錶形式 jdk1.8 陣列 鍊錶 紅黑樹 雜湊表長度不大於8,鍊錶長度達到8,首先進行,resize陣列擴容 如果雜湊表長度大於64,鍊錶長度到達8,就會把鍊錶結構轉化成紅黑樹結構 執行緒安全 實現更加精細,對map集合中的桶加鎖 採用分段鎖,預設 segment的陣列長度 16...