吊打面試官之HashMap

2021-10-03 18:01:20 字數 1694 閱讀 7457

hashmap的底層資料結構是什麼?

jdk1.7和jdk1.7前使用的是陣列,鍊錶

jdk1.8和jdk1.8後使用的是陣列,鍊錶,紅黑樹

hashmap的put方法流程是怎麼樣的?

1.先獲取key的hash值

注意:通過key獲取hash值,直接獲取hash值就可以了,但是這裡把key的hash值的前16個位元組和後16個位元組用^來運算,是為什麼呢?           使hash值更加隨機,防止避免通過hash值計算出來的索引大概率的為乙個索引值

2.通過上一步獲取的hash值計算索引

通過源**我們可以發現計算索引的公式為 (n-1) &  hash,   n為陣列長度hashmap預設陣列長度為16,hash為上一步計算出來的hash值

hashmap中陣列的長度預設是16,每次擴容1倍,這是為什麼呢?

通過上面的**我們可以發現計算索引的值和hash值與陣列的長度有關,通過&來計算

16-1 =15 , 15的二進位制值為   1111

32-1 = 31 , 31的二進位制值為   11111

所有二的等次冪減1的二進位制所有位置的值都為 1,獲取的hash值是隨機的,所以當hashmap的陣列長度為2的等次冪時,計算出來的索引是隨機的,減少了hash碰撞,提高了hashmap效能

3.把資料儲存到指定的索引位置中,如果該索引位置有值,就會在該索引位置形成一條鍊錶,新增加的資料插入在原來的資料前面

jdk7是頭插法,把新增加的資料插入在鍊錶頭部,頭插法在多執行緒的情況下陣列擴容,會導致迴圈鍊錶的問題出現

jdk8是尾插法,把新增加的資料插入在鍊錶最後面,尾插法避免迴圈鍊錶這個問題

hashmap的get方法流程是怎麼樣的?

1.先通過key獲取key的hash值,通過計算獲取元素所在陣列的索引,獲取資料,使用hashcode和equals方法來比較key是否一樣,如果不一樣遍歷列表,再比較

hashmap的陣列什麼時候擴容?

hashmap中有乙個負載因子值為 0.75,當  hashmap中的元素個數* 0.75  =  hashmap中的陣列長度時,hashmap就會擴容,陣列擴大到原來的一倍長度

jdk7與jdk8中hashmap做了哪些改變?

1.jdk8中新增了紅黑樹資料結構,當鍊表長度超過8時,會把鍊錶轉成紅黑樹,當鍊表長度小於等於6的時候會把紅黑樹轉成鍊錶

2.jdk8中使用的是尾插法,jdk7中使用的是尾插法

hashmap是執行緒安全的嗎?

hashmap不是執行緒安全的,執行緒安全的map有hashtable和concurrenthashmap

推薦使用concurrenthashmap它的效率比hashtable要高,它採用的是分段鎖

hashtable採用的是synchronized

吊打面試官 hashMap

hashmap 知識點 hashmap是什麼?hashmap是用來儲存key value鍵值對的集合類 它具有儲存效率高,查詢速度快的特點。hashmap的底層實現原理是什麼?hashmap底層是基於 陣列 鍊錶 紅黑樹 結構來實現的,陣列元素採用node節點來儲存key value鍵值對的資訊。h...

產品經理面試篇 10秒吊打面試官

表面 請簡單介紹下自己。實際 你先出牌,我要看著打。最拽的自我介紹就是 我爸讓我來的!最快的撩妹攻略就是 i m rich!最狠的社會毒打就是 以上均來自真實案例!不過凡是無絕對嘛,既然以上套路都不是100 成功,那麼憑什麼素昧謀面的人有資格告訴你所謂的模板 攻略 注意事項 重點等等?後續內容沒有模...

Redis吊打面試官的經典面試題整理

1 redis為什麼是key,value的,為什麼不是支援sql的?這題第一眼看到有點懵逼 選擇key value的原因 key value簡單粗暴,使用方便?效率更佳?為什麼不支援sql 因為redis的記憶體模型是乙個hashtable,不使用表來儲存資料,也不會預定義或強制要求使用者對redi...