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

猜你喜欢

转载自www.cnblogs.com/zeroisbug/p/10168604.html