JDK8原始碼解析 HashMap(二)

2022-08-11 16:54:20 字數 1092 閱讀 5668

1. hashmap容量大小求值方法

//

返回2的冪次

static

final

int tablesizefor(int

cap)

(1)為什麼這裡需要 int n = cap - 1這樣呢?

首先我們要明白這個方法的作用是獲取輸入容量大小最近的2的冪次值。假設你傳過來的引數cap是16的話,經過下面的運算得出來的值為32,而不是16。所以這裡需要減去一。這樣才能獲此值最小的2冪次值。

(2)這裡左移之和為31=1+2+4+8+16,這裡為什麼是31呢?

這裡容量大小是int的型別,int的大小是32位,integer的最大值是  231-1。所以移動位數為31。還有如果 cap 不減一賦值給n的話,那麼結果會超過此範圍。 注意hashmap的最大容量為maximum_capacity = 1 << 30;這裡是30位,可能是因為如果這裡是左移31的話,上面的計算值最壞的結果是1 <<< 32位,那麼就超過了int的範圍了,最高位是留給數字的正負符號位的。

2.快速失敗機制(fail-fast)

hashmap只要結果發生了變化就會呼叫快速失敗機制,除了iterator自己的 remove 方法,則迭代器將丟擲concurrentmodificationexception。hashmap中有modcount欄位記錄結構改變次數,在進行迭代的時候判斷此欄位是否發生了變化。如果值不一樣則會丟擲異常。

3. 紅黑樹特點

(1)節點是紅色或者黑色。

(2)根節點是黑色。

(3)紅色節點的子節點是黑色。

(4)每個葉子節點(nil)是黑色。  

(5)從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

注意:紅色節點的子節點不能為紅色,必須為黑色。黑色節點的子節點可以為紅色也黑色。

丟擲問題:

1.hashmap的迭代器是怎麼獲取值的?例如 keyset()方法如下圖,我也不明白怎麼實現的。hashmap中也有valueset()等。如果有哪位大神知道其原理,請點撥一下我。:)

hashmap原始碼分析jdk8

最近看了下jdk8的hashmap原始碼,相比於7,在儲存結構上有了些改變。1.在jdk8之前,hashmap的儲存結構是陣列 鍊錶的形式,那麼這種方式隨著鍊錶的長度增加,效率也凸顯出來。所以在jdk8中這塊做了優化,當鍊表超過一定長度時轉化為紅黑樹來解決這個問題,下面用流程圖畫出hashmap 的...

HsahMap原始碼分析(jdk8)

基於雜湊表的 map 介面的實現。此實現提供所有可選的對映操作,並允許使用 null 值和 null 鍵。除了非同步和允許使用 null 之外,hashmap 類與 hashtable 大致相同。此類不保證對映的順序,特別是它不保證該順序恆久不變。此實現假定雜湊函式將元素適當地分布在各桶之間,可為基...

ubuntu原始碼安裝jdk8

最近學習j a,想起來沒有在ubuntu上使用過 因此想安裝下環境,並在ubuntu上試用mpxj讀取mpp檔案 新建目錄 mkdir usr lib jvm解壓 tar zxvf jdk 8u211 linux x64.tar.gz c usr lib jvm修改環境變數 vim bashrc追加...