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