jdk8下HashMap原始碼分析實現原理

2021-10-22 22:13:40 字數 1736 閱讀 9607

1.hashmap

繼承:抽象類abstractmap

實現:介面map、cloneable、serializable

2.hashmap的初始化

四個建構函式:

先看看無參建構函式

構建乙個hashmap例項,並初始化loadfactor=default_load_factor

來看看loadfactor和default_load_factor這兩個屬性的定義:

注釋為:hash表的載入因子

注釋為:當建構函式沒有指定載入因子時使用此值

可以看到無參夠咱函式的載入因子預設為0.75

至於載入因子的作用後面再講

現在我們執行此**:

看看記憶體圖:

那麼hashmap怎麼儲存資料的呢?來看看新增方法put()

3.hashmap的put();

put方法有四種,先看看第一種

put(k key, v value),原始碼如下:

直接呼叫putval(),第乙個引數呼叫了hash(key),來看看此方法:

功能:對傳入的key進行hash處理

原理:對傳入的key的hashcode值key的hashcode進行邏輯右移16位(>>>16)後的值進行位異或運算(^)

如果key為null,返回0

來看看putvalputval(int hash, k key, v value, boolean onlyifabsent,boolean evict) ,原始碼如下:

總結:擴容並將單向鍊錶長度》=8的轉換為紅黑樹結構

擴容分兩種情況:

a.第一次新增資料時

b.新增資料後資料個數大於閾值threshold

threshold為控制是否擴容的閾值,一般<=hashmap中存資料的node的容量,計算方式:容量*loadfactory,所以loadfactory的值也影響著擴容操作

看看擴容方法resize():

hashmap原始碼分析jdk8

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

JDK8中HashMap原始碼分析

jdk8對hashmap進行了一些修改,最大的不同就是利用了紅黑樹,所以其由 陣列 鍊錶或紅黑樹 組成。在jdk7及之前的hashmap中,根據key查詢value時,根據hash值我們能夠快速定位到陣列具體下標位置處的鍊錶,但是之後的話,需要順著鍊錶乙個個比較下去才能找到我們需要的,時間複雜度取決...

JDK8原始碼解析 HashMap(二)

1.hashmap容量大小求值方法 返回2的冪次 static final int tablesizefor int cap 1 為什麼這裡需要 int n cap 1這樣呢?首先我們要明白這個方法的作用是獲取輸入容量大小最近的2的冪次值。假設你傳過來的引數cap是16的話,經過下面的運算得出來的值...