深深的碼丨Java HashMap 透析

MobMsg發表於2020-01-14

Hashmap 的資料結構基礎是基於一維陣列實現的,向其新增元素時通過計算key的hash值來確定具體儲存位置。新增元素過程中若出現hash衝突,也就是N個元素key的hash值相等,處理方式為:將元素轉為連結串列結構儲存,若連結串列節點數超過閾值8(TREEIFY_THRESHOLD = 8;),會將連結串列結構轉為紅黑樹,此轉化過程史稱 Hashmap 樹化

本文將對 HashMap 的構造HashMap()、資料儲存put()、擴容resize()、樹化等過程中所涉及 JDK 原始碼做行級解釋。若有異議或建議歡迎您在文末留言討論,本小弟先做拋磚引玉!


HashMap 構造方法

HashMap 共提供了 4 種 構造方法,滿足各種常見場景下對容量的需求

	// 第1種:建立一個 HashMap 並指定 容量(initialCapacity) 和裝載因子(loadFactor)
    public HashMap(int initialCapacity, float loadFactor) {
    	// 指定容量不可小於0,但可設定為 0 。之後通過put()新增元素時,會resize()
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal initial capacity: " +
                                               initialCapacity);
        // 如果指定的容量超過了最大值,則自動置為最大值,也就是 1 << 30(也就是2的30次方)
        if (initialCapacity > MAXIMUM_CAPACITY)
            initialCapacity = MAXIMUM_CAPACITY;
        // 裝載因子不可小於等

相關文章