HashMap原始碼分析--jdk1.7
阿新 • • 發佈:2020-10-14
目錄
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;
記錄集合操作的次數。比如增、刪、改。