Hashmap原理解析筆記 最基礎的第一部分

2021-09-25 23:50:24 字數 1350 閱讀 1109

hashmap初始容量16,但數值大於64並且鍊錶長度大於等於8的時候,轉成紅黑樹,但小於6時又退回陣列加鍊表結構,每一次擴容又二分之一的機率以前存入的數不需要改變位置,因為15的二進位制與31的二進位制相差一位,

當存入數hash計算後的二進位制的的倒數第五位是0時,它&15或&31的結果都一樣.

以hashmap執行put方法為切入點,**理解hashmap的原理;通過這個方法 了解hashmap 在內部是如何進行資料儲存的,陣列+鍊錶+紅黑樹的儲存結構是如何形成的,又是在何種情況下將鍊錶轉換成紅黑樹來優化效能的

public v put

(k key, v value)

/*我們put方法傳入了key和value,它會呼叫putval方法會返回五個值

hash(key):計算了key的hash值,等下看它時如何計算的;

*/

static

final

inthash

(object key)

/*這個方法十分精妙,它做了什麼,為什麼要這麼返回:

顯而易見:key為null時返回0,當不為0的時候它做了乙個異或操作;

異或的左邊時key的hash值,右邊是這個hash值右移16位後的值,

其實就是把key的hash值的前16位跟後16位異或了一下,使這個返回的值更加雜湊了.減少了碰撞率(就是減少了hash值相等的情況);

*/

//

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

//遍歷的過程中,如果發現與某個結點的 hash和key,這依然是一次修改操作

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;}}

//e 不是 null,說明當前的 put 操作是一次修改操作並且e指向的就是需要被修改的結點

if(e != null)

}//e 不是 null,說明當前的 put 操作是一次修改操作並且e指向的就是需要被修改的結點

++modcount;if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

HashMap原理解析

日常工作中經常用到map,基本上是用map map new hashmap 來得到乙個hashmap物件,之前並未深入去研究hashmap的實現原理,只是去簡單的去建立然後使用它。這次想深入了解便,去研究了一下hashmap的原始碼。做點筆記,記錄一下自己的一些收穫,想到哪寫到哪吧。hashmap繼...

HashMap原理解析

hashmap在jdk1.8之前和jdk1.8之後內部實現有所不同 在jdk1.8之前,hashmap底層是陣列和鍊錶的結構,從jdk1.8開始內部實現使用了陣列和鍊錶以及紅黑樹一 jdk1.8之前的hashmap實現原理 以jdk1.7為例 先看構造方法 public hashmap public...

HashMap的原理解析

進行hashmap原理解析 手寫乙個簡單的hashmap hashmap的底層執行是陣列加鍊表 鍊錶就是為了解決雜湊碰撞的情況 public class hashmap 關羽的hash值是 679082 index is 2 孫權的hash值是 751370 index is 5 張飛的hash值是...