HashMap底层数据结构是数组+链表,JDK1.8中还引入了红黑树,当链表长度超过8个时,会将链表转成红黑树,以提升其查找性能。每次put之后,会检测一下是否需要扩容,size超过了 总容量 * 负载因子,则会扩容。因此在日常开发中,如果可以预估HashMap会存入节点的数量,则应该在初始化时,指定其容量。也是一个综合考虑,如果设置过小,HashMap每put少量的数据,都要进行一次扩容,而扩容操作会消耗大量的性能。如果设置过大的话,如果设成1,容量还是16,假设现在数组上已经占用的15个,再要put数据进来,计算数组index时,发生hash碰撞的概率将达到15/16,这违背的HashMap减少hash碰撞的原则。

谈谈Hashmap的容量为什么是2的幂次问题

谈谈Hashmap的容量为什么是2的幂次问题

谈谈Hashmap的容量为什么是2的幂次问题