HashMap 筆記(jdk1.8)
阿新 • • 發佈:2018-12-24
一.常量定義:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 16 static final int MAXIMUM_CAPACITY = 1 << 30; static final float DEFAULT_LOAD_FACTOR = 0.75f; static final int TREEIFY_THRESHOLD = 8; static final int UNTREEIFY_THRESHOLD = 6; static final int MIN_TREEIFY_CAPACITY = 64;
二.初始化:
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; } //AbstractMap父類,構造方法只是簡單的賦值loadFactor 0.75f
三.雜湊函式:
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }//1.put 時候key可以為null,對應hashcode會設定為0 //2.(h = key.hashCode()) ^ (h >>> 16) 先呼叫底層的hashcode取hash值,再讓hash值的高位參與運算 (二次雜湊) //3.二次雜湊, hashcode是32位的,無符號右移16位,生成的就是16位0加原高位的16位值,,異或計算也就變成了高16位和低16位在低16位處進行異或,原高16位不變。 //需要這樣去二次雜湊,主要因為當hashmap 陣列比較小的時候所有bit都參與運算了,防止hash衝突太大,
四. 擴容函式resize():