1、变量
哈希桶的长度,也就是数组的长度。1<<4表示1左移4次,是2的4次方,16
默认负载因子
树化的条件之一(另一个是数组长度要超过64),链表长度超过8以后,就转化为红黑树
解树化条件,红黑树结点小于6个,就没必要用树存了,转化为链表
树化的条件之一,数组长度超过64
结点实现了Map的Entry接口,所以在HashMap中可以得到,可以把这个Map.Entry就理解成结点。实际上是set。
2、构造方法
两个参数的构造方法,传入指定容量和负载因子
一个参数的构造方法,传入初始容量
空参的构造方法,负载因子是默认值,0.75。重点注意:此时并没有初始化数组大小,仅仅只初始化了负载因子。分配数组大小是在put里做到的。
可以直接把实现了Map的集合传入HashMap。
3、函数方法
put方法会调用hash()方法,和putVal()方法
其中hash()方法是找到传入的key的hashCode值,赋给h变量,再让h和h右移16位的结果做异或,目的是为了得到更均匀的值。再将这个值返回。
分为多种情况:
当使用空参构造方法时,数组长度是没有初始化的,为空。此时第一次调用put方法时,数组大小被默认分配为16,经过这个if语句以后才真正的让数组初始化了
调用resize()
如果数组位置为空,就直接插,不为空就往下判断,用尾插法插入,同时判断是不是要变成红黑树。
根据binCount来判断的,创造一颗红黑树
this.threshold就是数组长度,这个tableSizeFor会让数组的长度尽可能的接近2的次幂。