HashMap原始碼分析

2021-10-05 22:27:07 字數 2548 閱讀 3917

jdk1.8的hashmap底層採用的是 陣列+鍊錶+紅黑樹

* 預設容量16,如果自定義設定容量,必須是2的n次冪

*/static

final

int default_initial_capacity =

1<<4;

// aka 16

/** * 最大容量

*/static

final

int maximum_capacity =

1<<30;

/** * 載入因子

*/static

final

float default_load_factor =

0.75f

;/**

* 鍊錶長度到8變為紅黑樹

*/static

final

int treeify_threshold =8;

/** * 紅黑樹長度小於6,變為鍊錶

*/static

final

int untreeify_threshold =6;

/** * 儲存節點的陣列

*/transient node

table;

/**

* 載入預設的載入因子,也就是陣列擴容臨界點

*/public

hashmap()

static

class

node

implements

map.entry

public v put

(k key, v value)

/** * implements map.put and related methods.

** @param hash hash for key

* @param key the key

* @param value the value to put

* @param onlyifabsent if true, don't change existing value

* @param evict if false, the table is in creation mode.

* @return previous value, or null if none

*/final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

//如果鍊錶裡面找到相同的key,覆蓋原先的值

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;}}

if(e != null)

}++modcount;

//把size+1,並且盤點是否大於閾值,如果大於閾值,進行resize擴容,每次擴容是之前的額2倍if(

++size > threshold)

resize()

;afternodeinsertion

(evict)

;return null;

}

public v get

(object key)

/** * implements map.get and related methods.

** @param hash hash for key

* @param key the key

* @return the node, or null if none

*/final node

getnode

(int hash, object key)

while

((e = e.next)

!= null);}

}return null;

}

第一,如圖所示,hashmap有3個要素:hash函式+陣列+單鏈表

第二,對於hash函式而言,效能要快,對於給定的key,要能夠快速計算出在陣列中的index。那麼什麼運算夠快呢?顯然是位運算!要均勻分布,要較少碰撞。說白了,我們希望通過hash函式,讓資料均勻分布在陣列中,不希望大量資料發生碰撞,導致鍊錶過長。那麼怎麼辦到呢?也是利用位運算,通過對資料的二進位制的位進行移動,讓hash函式得到的資料雜湊開來,從而減低了碰撞的概率。

參考:戲入人生

HashMap原始碼分析

public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...

HashMap 原始碼分析

1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...

HashMap原始碼分析

public v put k key,v value if key null return putfornullkey value int hash hash key int i indexfor hash,table.length for entrye table i e null e e.nex...