这里写自定义目录标题
关于hashMap的一点总结
Q:
- HashMap 默认bucket数组多大?
- 如果new HashMap<>(19),bucket数组多大?
- HashMap 什么时候开辟bucket数组占用内存?
- HashMap 何时扩容?
A:
- hashMap的默认bucket数组默认为16
- HashMap 的 bucket 数组大小一定是2的幂,如果 new 的时候指定了容量且不是2的幂,实际容量会是最接近(大于)指定容量的2的幂,比如 new HashMap<>(19),比19大且最接近的2的幂是32,实际容量就是32。
- 第一次 put 时
- put的元素达到容量乘负载因子的时候,默认16*0.75
总结
HashMap 在 new 后并不会立即分配bucket数组,而是第一次 put 时初始化,类似 ArrayList 在第一次 add 时分配空间。
HashMap 的 bucket 数组大小一定是2的幂,如果 new 的时候指定了容量且不是2的幂,实际容量会是最接近(大于)指定容量的2的幂,比如 new HashMap<>(19),比19大且最接近的2的幂是32,实际容量就是32。
HashMap 在 put 的元素数量大于 Capacity * LoadFactor(默认16 * 0.75) 之后会进行扩容。
JDK8处于提升性能的考虑,在哈希碰撞的链表长度达到TREEIFY_THRESHOLD(默认8)后,会把该链表转变成树结构。
JDK8在 resize 的时候,通过巧妙的设计,减少了 rehash 的性能消耗。