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...