文章字数: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