底层的两个变量
- loadFactor:加载因子,默认是0.75(是经过反复测试的)
- threshold:当map里面的数据大于该值就会进行扩容(threshold=容量*加载因子)
HashMap提供四种构造方法:一是给定初始容量和加载因子的构造方法,二是给定初始容量,使用默认的加载因子,三是什么参数都不给,使用默认的初始容量和默认的加载因子,四是传进一个Map,使用默认的加载因子。
但是,无论使用什么构造方法,HashMap都没有进行初始化容量设置,都是一个空的HashMap,这就是HashMap的懒加载机制,只有当你第一次添加元素,才会进行第一次的容量设置。
第一次扩容(分两种情况):
第一种:没有设置初始化容量,使用默认的DEFAULT_INITIAL_CAPACITY=16进行初始化设置;
第二种:设置了初始化容量;当设定值是2的n次方时,就按该值设置,否则,会找到乐意大于该值的但是最接近的2的n次方的值进行设置
第二次扩容:
在容量不大于最大值(1<<30,即1073741824)的情况下,默认都是扩容为两倍:
新容量 = 旧容量*2
新threshold = 新容量*负载因子
如果容量超出了这个数,则不再增长,且阈值会被设置为Integer.MAX_VALUE( 2^31-1,即永远不会超出阈值了)。