1、哈希表的加载因子(重点)
// 加载因子
final float loadFactor;
############################################
loadFactor加载因子,是用来衡量 HashMap 满的程度,
表示HashMap的疏密程度,影响hash操作到同一个数组位置的概率,
计算HashMap的实时加载因子的方法为:size/capacity,
而不是占用桶的数量去除以capacity。capacity 是桶的数量,
也就是 table 的长度length。
loadFactor太大导致查找元素效率低,太小导致数组的利用率低,
存放的数据会很分散。
loadFactor的默认值为0.75f是官方给出的一个比较好的临界值。
当HashMap里面容纳的元素已经达到HashMap数组长度的75%时,
表示HashMap太挤了,需要扩容,而扩容这个过程涉及到 rehash
复制数据等操作,非常消耗性能。
所以开发中尽量减少扩容的次数,
可以通过创建HashMap集合对象时指定初始容量来尽量避免。
2、为什么加载因子设置为0.75,初始化临界值是12?
loadFactor越趋近于1,那么 数组中存放的数据(entry)也就越多,也就越密,也就是会让链表的长度增加,loadFactor越小,也就是趋近于0,数组中存放的数据(entry)也就越少,也就越稀疏。
举例
加载因子是0.4。 那么16*0.4--->6 如果数组中满6个空间就扩容会造成数组利用率太低了。
加载因子是0.9。 那么16*0.9---->14 那么这样就会导致链表有点多了。导致查找元素效率低。
所以既兼顾数组利用率又考虑链表不要太多,经过大量测试0.75是最佳方案
threshold(临界值)计算公式:capacity(数组长度默认16) * loadFactor(负载因子默认0.75)。这个值是当前已占用数组长度的最大值。当Size>=threshold的时候,那么就要考虑对数组的resize(扩容),也就是说,这个的意思就是 衡量数组是否需要扩增的一个标准。 扩容后的 HashMap 容量是之前容量的两倍.
版权声明:本文为weixin_43811057原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。