Hashmap原始碼解析

2021-09-29 01:56:03 字數 1107 閱讀 2182

話不多說,直接看hashmap的put、方法原始碼  這是jdk1.8的原始碼  與1.7有所不同。

final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

1.首先引數,key和value可以理解  hash是用來幹嘛的呢,使用key的hash函式生成乙個hash值,也作為引數傳入,首先第一次儲存的時候判斷宣告的陣列tab肯定是null的 所以會有個初始化陣列的過程 而陣列的長度為2的冪次(偏移量的一些考量),接下來 的一步很重要,考慮到hash衝突,可能會導致儲存的陣列下標重複,所以此處又將hash值與陣列長度進行了乙個位運算,最終獲得的值作為陣列下標,然後將剛剛傳進來的引數值放入node節點(鍊錶的使用),此時的鍊錶下乙個指向next還沒東西,將這個鍊錶的節點存入陣列下標為剛才計算的下標處,key不重複的情況下第一次儲存過程結束。

2.判斷如果key存在 也就是hash值與陣列長度的位運算之後的下標已經有儲存節點了的話,再進行hash值的比對和key的比對,確認為key重複,將值進行替換覆蓋處理。1.8加入了紅黑樹treenode,當鍊表長度大於8的時候資料將儲存在紅黑樹的節點中,以提高效率  紅黑樹的特點是均衡了查詢和增刪的平衡效能  是兩者都相對快,平均效能比較均衡。

第一次理解原始碼還有很多不足 但是感覺相對以前看原始碼已經有了一些進步 ,每次進步一點 終究能搞懂,再一次感嘆資料結構的神奇。

HashMap原始碼解析

以jdk1.8為例,hashmap是乙個用於儲存key value鍵值對的集合,每乙個鍵值對是乙個node jdk1.7叫做entry 後台是用乙個node陣列來存放資料,這個node陣列就是hashmap的主幹。這裡我們主要來分析hashmap的get和put方法。public v put k k...

hashMap 原始碼解析

這幾天跳槽 被人問得最多的問題就是基礎方面的知識.當時學習的時候有點囫圇吞棗.現在回頭把這些基本的集合類原始碼都仔細閱讀下 hashmap 用的是最頻繁的.所以問得也最多了.initcapacity 初始化的容量 loadfacotr 負載因子 主要用來計算threshold的值 threshold...

HashMap原始碼解析

預設字段 static final int default initial capacity 1 4 預設node的陣列長度 16 static final int maximum capacity 1 30 陣列的最大長度 2 30 static final float default load ...