1. 程式人生 > >HashMap 筆記(jdk1.8)

HashMap 筆記(jdk1.8)

一.常量定義:

  

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():