HashMap的底層原理:
JKD8.0中:
HashMap的底層儲存結構是數組+鏈表+紅黑樹。
當實例化一個 HashMap時,創建一個Node(在JDK7.0是entry,JDK8.0是Node,Node是entry的子類)數組(但是沒有創建數組的大小,當進行put操作時才會生成數組的長度),會初始化initialCapacity(初始的數組長度,默認大小為16)和loadFactor(裝載因子,默認大小為0.75),在put第一對映射關系 時,系統會創建一個長度為initialCapacity的Node數組,這個長度在哈希表 中被稱為容量(Capacity),在這個數組中可以存放元素的位置我們稱之為 “桶”(bucket),每個bucket都有自己的索引,系統可以根據索引快速的查 找bucket中的元素。
HashMap進行擴容和樹形化的時間:
數組擴容:
當HashMap中的Node個數個數超過threshold(threshold臨界點,是initialCapacity(初始長度)*loadFactor(裝載因子)。大小為12)時,進行擴容,Node數組擴大到原來的兩倍。
HashMap樹形化:
鏈表長度>=8 && 數組大小>=64,如果不滿足以上條件進行數組擴容。
當HashMap中的其中一個鏈的對象個數如果達到了8個,此時如果capacity沒有 達到64,那么HashMap會先擴容解決,如果已經達到了64,那么這個鏈會變成 樹,結點類型由Node變成TreeNode類型。當然,如果當映射關系被移除后, 下次resize方法時判斷樹的結點個數低於6個,也會把樹再轉為鏈表。
圖片版: