面試系列 HashMap相關

2021-10-10 06:32:49 字數 804 閱讀 9153

資料結構

jdk1.7 採用陣列+鍊錶的方式,使用頭插法新增元素

jdk1.8 採用陣列+鍊錶+紅黑樹,使用尾插法新增元素

擴容機制(resize)

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容量,其二是載入因子 首先,設...