一般情况下,当元素数量超过阈值时便会触发扩容。每次扩容的容量都是之前容量的2倍。HashMap的容量是有上限的,必须小于1<<30,即1073741824。如果容量超出了这个数,则不再增长,且阈值会被设置为Integer.MAX_VALUE。
JDK7的扩容机制:
- 无参时:以默认容量、默认负载因子、默认阈值初始化数组。内部数组是空数组。
- 有参时:根据参数确定容量,负载因子,阈值等。
- 第一次put时会初始化数组,基容量变为不小于指定容量的2的幂数,然后根据负载因子确定阈值。
- 如果不是第一次扩容,则新容量=旧容量*2,新阈值=新容量*负载因子。
JDK8的扩容机制:
- 无参时:实例化的HashMap默认内部数组是null,即没有实例化。第一次调用put方法时,则会开始第一次初始化扩容,长度为16。
- 有参时:用于指定容量。会根据指定的正整数找到不小于指定容量的2的幂数,将这个数设置赋值给阈值。第一次调用put方法时,会将阈值赋给容量,然后让阈值=容量*负载因子。
- 如果不是第一次扩容,则容量变为原来的2倍,阈值也变为原来的2倍。
此外还有几个细节需要注意:
- 首次put时,先会触发扩容(算是初始化),然后存入数据,然后判断是否需要扩容。
- 不是首次put,则不再初始化,直接存入数据,然后判断是否需要扩容。
注意:本文归作者所有,未经作者允许,不得转载