HashMap:數組+鏈表+紅黑樹,環鏈表-尾插法,二的倍數數組

版本:JDK1.8。html

這裏把數組每一個元素稱爲數組

  1. 使用數組+鏈表+紅黑樹:使用紅黑樹爲了解決鏈表過長致使性能降低的問題。鏈表大於8就會轉爲紅黑樹
  2. JDK1.8後,hashmap使用尾插法。新增的元素會放在bucket(桶)的最後面。
  • 爲了解決頭插入法在多線程下可能出現環鏈表的問題。同時鏈表內元素順序保持不變
  1. 使用2的倍數做爲數組的大小:更加容易計算他們所在的桶

若是是2的倍數的話,更容易計算所在的桶。好比原來是4,擴展爲8多線程

  • 在原來桶0的元素,會在新的桶0和4中源碼分析

  • 在原來桶1的元素,會在新的桶1和5中性能

  • 在原來桶2的元素,會在新的桶2和6中.net

  • 在原來桶3的元素,會在新的桶3和7中線程

爲何會這樣呢?首先須要是將hash值取餘獲得所在桶。code

原來通長度是4,取餘則是二進制後兩位。好比在桶0,後兩位必然是00,桶1則是01,桶2則是10,桶3則是11。對於長度爲8,則是3位,原來桶0的00將有兩種可能:000100也就是桶0和桶4(原來桶位置 + 原來桶長度 = 0 + 4)。htm

參考:blog

  1. 關於JDK1.8 HashMap擴容部分源碼分析 :在resize擴容爲何會出現環鏈表

  2. jdk1.8的HashMap和ConcurrentHashMap

相關文章
相關標籤/搜索