HashMap的底層源碼及數據結構解析

關於HashMap,它是咱們使用很是多的集合容器,它是基於哈希表的 Map 接口的實現,以key-value的形式存在。實際上HashMap是一個「鏈表散列」,以下是它數據結構:數組

HashMap數據結構

HashMap底層實現仍是數組,只是數組的每一項都是一條鏈。數據結構

在hashMap裏有兩個重要因子,初始容量(Capacity)加載因子(loadFactor)性能

這兩個參數是影響HashMap性能的重要參數,其中容量表示哈希表中桶的數量,初始容量是建立哈希表時的容量,加載因子是哈希表在其容量自動增長以前能夠達到多滿的一種尺度(默認是0.75),它衡量的是一個散列表的空間的使用程度,加載因子越大表示散列表的裝填程度越高,反之愈小。對象

從源碼來看,能夠分爲如下步驟:blog

HashMap是一個Node類型的數組table,初始化爲Null。索引

  1. 建立對象是,先將加載因子loadFactor初始化爲0.75,其他成員不變。
  2. 建立元素時,先將元素的key的哈希值獲取後,計算出在數組中的索引位置,分爲如下幾種狀況:a.若沒有其餘值,則直接存放。b.若相等,則覆蓋。c.若不相等,則繼續判斷,看是不是樹狀結構仍是鏈表,根據不一樣狀況處理。
  3. 若須要擴容,分兩種狀況:a.第一次添加,容量爲16,臨界值爲容量*加載因子。 b.若後續添加,是容量的2倍,臨界值也爲以前臨界值的2倍。
  4. 當鏈表中節點數>=7 && capacity>=64 則將鏈表變成樹結構。

不過,在JDK1.8後發生了變化接口

版本 結構 table數據類型 初始容量
jdk7 數組+鏈表 Entry 16
jdk8 數組+鏈表+紅黑樹 Node 0

這兩種在容量上的區別是jdk7初始化table時容量爲16(餓漢式),而jdk8建立對象時並無初始化,而是第一次添加元素時table初始化爲16(懶漢式)。ci

相關文章
相關標籤/搜索