HashMap原始碼解讀(jdk1.8)
1、相關常量
預設初始化容量(大小)
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
預設負載因子:用於擴容的,比如16*0.75=12,當容量達到12時就會擴容。
static final float DEFAULT_LOAD_FACTOR = 0.75f;
樹化:連結串列變紅黑樹,前提是達到最小樹化容量。
static final int TREEIFY_THRESHOLD = 8;
最小樹化容量
static final int MIN_TREEIFY_CAPACITY = 64;
反樹化:紅黑書變連結串列
static final int UNTREEIFY_THRESHOLD = 6;
2、底層資料結構
陣列+連結串列+紅黑樹
3、hash衝突怎麼處理?
原始碼:
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p;
4、連結串列是尾部插入還是首部?
原始碼:
p.next = newNode(hash, key, value, null);
5、擴容機制?
else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1; // double threshold