文章字数:273,阅读全文大约需要1分钟
HashMap初始大小为16,即内部容器容量为16。但是如果是自定义大小的HashMap,那么什么情况下会触发扩容?
关键点
loadFactor:负载因子,默认0.75f。当内部元素大于容器容量*负载因子时触发扩容。table:实际存储数据的数组transient Node<K,V>[] table;初始化大小也就是table的大小。tableSizeFor():这个方法保证传入的初始化值是2 的 N 次幂,比如传入1000,经过这个方法转换就成了1024。而实际存储大小为768(1024 * 0.75)
扩容机制
- 传入的初始大小经过
tableSizeFor()转换,保证值为2 的 N 次幂 - 初始化负载因子为
0.75f - 生成内部存储数组
table,大小为初始化传入的值,默认16 - 当内部元素超过扩容阈值(初始化大小*负载因子)时扩容,扩容大小为原理的一倍
建议
初始值 = (需要存储的元素 / 负载因子) + 1