資料結構
jdk1.7 採用陣列+鍊錶的方式,使用頭插法新增元素擴容機制(resize)jdk1.8 採用陣列+鍊錶+紅黑樹,使用尾插法新增元素
capacity:hashmap當前長度,預設為16
loadfactor:負載因子,預設值0.75f
擴容時機
當前hashmap陣列預設為16,當存入第13(大於capacity*loadfactor)個時,就需要resize觸發擴容擴容步驟
擴容:建立乙個新的entry空陣列,長度是原陣列的2倍。執行緒安全性rehash:遍歷原entry陣列,把所有的entry重新hash到新陣列(陣列長度變化,需要重新計算hash值)
jdk1.7和jdk1.8都不是執行緒安全的怎麼保證執行緒安全性jdk1.7採用頭插法插入,在擴容的時候會造成環形鍊錶,在插入元素時可能會出現死迴圈
jdk1.8使用尾插法插入,在擴容時會維持鍊錶原有的資料結構,不會造成死迴圈,但是會出現資料丟失、覆蓋
三種方式使用hashtable,方法中都新增了synchronized關鍵字來確保執行緒同步,效能差,併發度不高
使用collections.synchronizedmap(),於hashtable不同的是使用了物件鎖,內部維護了互斥鎖(mutex)
使用concurrenthashmap,使用分段鎖
HashMap原始碼系列 HashMap的屬性
public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...
HashMap以及跟HashMap相關的內容
hashmap相信大家都用過,是以這樣的格式儲存的。其實內部真正用於儲存的是entry的陣列table 桶 下面就是源 了已經標註出來了 emprty table是個空表,用於是初始化時使用的。default load factor是負載因子,default initial capacity是初始化...
HashMap面試準備
hashmap linkedhashmap concurrenthashmap 總的來說,1.7的hashmap的底層是陣列 鍊錶,而1.8的hashmap的底層是陣列 鍊錶或紅黑樹。hashmap是執行緒不安全的。初始化的方式有三種 引數有兩個,其一是capacity容量,其二是載入因子 首先,設...