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