JavaHashMap的扩容机制

我们希望在内存中临时存放一些数据,那么我们可以使用官方提供的封装好的集合,比如List、HahsMap、Set等,作为数据存储的容器

创建集合 

当我们创建一个集合对象的时候,实际上就是在内存里面一次性申请内存空间,而这个内存空间的大小是在创建集合的时候去指定的,比如List的默认大小为10,HashMap的默认大小为16.

扩容集合 

实际上我们需要存储的数据量往往是大于存储容器的大小的。针对这种情况,通常做法就是扩容,当集合存储容量达到某个阈值的时候,集合就会进行一个动态扩容,从而更好的满足更多的数据存储的需求。而List和HashMap底层是数组,所以基本上只需要去新建一个更长的数组,然后把原来的数组里面的数据拷贝到新数组里面就可以了

扩容原理

当HashMao的容器元素个数超过临界值的时候会自动触发扩容,扩容公式为:

threashold(临界值)=loadFactor(负载因子)*capacity(容量大小)

 负载因子的默认值为0.75,而容量大小默认是16,也就说元素个数达到12的时候会触发扩容,扩容大小是原来的2倍。

由于动态扩容机制的存在,所以我们在实际应用里面需要注意集合初始化的时候明确去指定集合的大小,避免频繁扩容带导致的性能上的影响,,加设我们向HashMap存储1024个元素,如果按照默认的值是16的情况下,随着元素的不断增加,会造成至少7次扩容,对性能影响非常大的。

扩容因子

扩容因子表示Hash表中的元素填充程度,扩容因子值越大意味着触发扩容的元素个数会更多。虽然整体空间利用率比较高,但是Hash冲突的概率也会增加。反之,扩容因子越小,那么触发扩容元素的个数也就越小,那么意味着Hash冲突的概率会减少,但是对于内存空间的浪费就比较多,而且还会增加扩容的频率。扩容因子的值的设置本质就是一个冲突的概率以及空间利用率之间的一个平衡。 

你可能感兴趣的:(java面试题,java,spring,jvm)