面試連環炮系列(七):HashMap的put操作做了什么


  1. HashMap的put操作做了什么?
    HashMap的是由數組和鏈表構成的,JDK7之后加入了紅黑樹處理哈希沖突。put操作的步驟是這樣的:

    1. 根據key值計算出哈希值作為數組下標。如果數組的這個位置是空的,把k放進去,put操作就完成了。
    2. 如果數組位置不為空,這個元素必然是個鏈表。遍歷鏈表逐一比對value,如果value在鏈表中不存在,就把新建節點,將value放進去,put操作完成。
    3. 如果鏈表中value存在,則替換原節點的value,put操作完成。
    4. 如果鏈表節點數已經達到8個,首先判斷當前hashMap的長度,如果不足64,只進行resize,擴容table,如果達到64就將沖突的鏈表為紅黑樹。
  2. 元素在數組中的位置怎么計算出來的
    采用數組長度與value的哈希值取與操作計算的,表達式:(n - 1) & hash,n是數組長度,hash是hash(value)。

  3. 紅黑樹有什么優勢,為什么要將鏈表轉成紅黑樹
    紅黑樹的平均查找長度是log(n),長度為8的時候,平均查找長度為3,如果使用鏈表,平均查找長度為8/2=4。鏈表長度如果是小於等於6,平均查找長度6/2=3,雖然速度也很快,但是轉化為樹結構和生成樹的時間也會耗時。

  4. 什么情況下數組會擴容
    當元素個數超過數組長度 * loadFactor時,就會進行數組擴容,loadFactor的默認值為0.75。默認情況下,數組大小為16,元素個數超過16 * 0.75=12的時候,就把數組的大小擴展一倍,即2 * 16 = 32,重新計算每個元素在數組中的位置,這是一個非常消耗性能的操作。

參考(部分摘抄的文字版權屬於原作者):

https://www.jianshu.com/p/2c7a4a4e1f53
https://www.cnblogs.com/liwei2222/p/8013367.html
https://www.cnblogs.com/williamjie/p/9358291.html
https://www.cnblogs.com/xc-chejj/p/10825676.html

雞湯:你全心全意的付出,還不如別人的隨便搞搞。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM