第12题:为什么HashMap的初始容量是16
📚回答:
前提条件:
HashMap要求数组长度必须是2的指数次幂,因此初始容量也必须满足这一条件。为什么选择16?
- 空间占用 vs 查询效率:
- 初始容量过小(如4或8)会导致频繁扩容,增加性能开销。
- 初始容量过大(如32或64)会浪费内存空间,尤其在数据量较小时。
- 16是一个经验值,在空间占用和查询效率之间做了权衡,既能避免频繁扩容,又不会浪费过多内存。
- 空间占用 vs 查询效率:
扩容机制的影响:
HashMap每次扩容为原容量的2倍,初始容量为16可以确保后续扩容时数组长度始终是2的幂。- 这样既保证了散列分布均匀,又简化了扩容逻辑。
💡面试官视角:
- 面试官可能会问“为什么不是其他2的幂,比如8或32?”答:8可能太小,容易触发扩容;32可能太大,浪费内存;16是一个折中值,适合大多数场景。
- 面试官可能会追问“如何自定义初始容量?”答:可以通过构造方法指定初始容量,如
new HashMap<>(32)。