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的話,經過下面的運算得出來的值...