不积跬步无以至千里,后继才能薄发
默认初始容量是在构造HashMap时,不定义初始容量默认指定的大小,默认大小为1<<4也就是16;
最大容量是单个HashMap实例所能装载的最大容量,值为1<<30,也就是536,870,912个元素;
默认装载因子,在构造HashMap时,不指定装载因子时,默认为0.75f。装载因子的作用是留一部分的容量作为冗余,避免hash之后过多元素分配到一个桶里,导致hashmap退化成链表。
最小树化阈值是jdk1.8中加入的,控制HashMap在什么情况下会将桶中的链表转为红黑树,默认为64
树化阈值是在jdk1.8中被加入的,默认为8,应用在我们常听说的红黑树中,在HashMap实例的元素数量大于最小化树化阈值且大于树化阈值时,就会将链表转为红黑树。
链表化阈值是jdk1.8中被加入,默认为6,之所以不与树化阈值相等,是为了在同一桶中的元素增删时不会导致频繁树化和链表化。
这是hashmap核心的方法之一,也是HashMap中的“Hash”的体现,其中进行了一次hash计算和对hash值进行和高16位进行异或计算,也就是其中的 (h = key.hashCode()) ^ (h >>> 16) ,hash方法之所以要这样“多此一举”,目的是为了在使用hash值进行映射时避免与运算丢失高位特征,以保障元素趋于平均分布。
1 | static final int hash(Object key) { |
这是hashmap的put()方法中最终调用的方法,也是添加元素功能的实现方法;其中hashmap采用了lazy-load的思想,构造HashMap实例时并不会对内部数组进行初始化,而是在首次put的时候才进行。
其中逻辑: