HashMap底层数据结构是数组+链表,JDK1.8中还引入了红黑树,当链表长度超过8个时,会将链表转成红黑树,以提升其查找性能。当容量为2的幂时,上述n -1 对应的二进制数全为1,这样才能保证它和key的hashcode做&运算后,能够均匀分布,这样才能减少hash碰撞的次数。因此在日常开发中,如果可以预估HashMap会存入节点的数量,则应该在初始化时,指定其容量。如果设置过大的话,如果设成1,容量还是16,假设现在数组上已经占用的15个,再要put数据进来,计算数组index时,发生hash碰撞的概率将达到15/16,这违背的HashMap减少hash碰撞的原则。看了网上很多文章,说HashMap在元素达到负载因子对应数的时候就发生扩容。

HashMap容量和负载因子使用说明

HashMap容量和负载因子使用说明

HashMap容量和负载因子使用说明