1. 程式人生 > 實用技巧 >HashMap原始碼分析--jdk1.7

HashMap原始碼分析--jdk1.7

目錄

1 簡介

Jdk1.7的HashMap是使用陣列+連結串列實現了。
Jdk1.8的HashMap是使用陣列+連結串列+紅黑樹實現了。
原始碼中採用了很多的位運算,裡面的邏輯也是令人拍案叫絕~~

HashMap的結構大概長如下圖的樣子:

在Jdk1.7中

2 幾個重要的變數

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

預設的初始陣列容量16,採用的是1左移4位得到。那你為啥不直接寫16呢?

transient int size;

集合的容量

static final int MAXIMUM_CAPACITY = 1 << 30;

集合的最大容量1073741824,10億多,應該是不會用完吧。。

final float loadFactor;
static final float DEFAULT_LOAD_FACTOR = 0.75f;

載入因子,預設0.75,用來判斷集合是否需要擴容會用到。

int threshold;

閾值。用來判斷集合是否需要擴容,是根據陣列大小和載入因子計算得來的。如集合容量為16,載入因子為0.75,閾值就是16*0.75=12,當然不是集合容量達到12就要擴容,還需要一個條件,後面會說明。

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

我們說的HashMap的陣列指的就是這個變數table,存放的是Entry物件的引用。這個Entry物件就是我們說的連結串列的結點。

static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        int hash;
        
        ...
}

HashMap的連結串列結點,記錄key,value,下個結點索引next,當前結點key的hash值。

transient int modCount;

記錄集合操作的次數。比如增、刪、改。