Java教程

HashMap中的负载因子

HashMap是Java集合框架中的高性能数据结构之一。它为插入和检索提供了恒定的时间性能。有两个因素会影响哈希图的性能。
初始容量 负载系数
在创建HashMap对象时,我们必须非常仔细地选择这两个因素。创建HashMap类的构造函数时,可以配置负载因子和初始容量,如下所示:
HashMap hm=new HashMap(int initialCapacity, float loadFactor);

HashMap的初始容量

HashMap的初始容量是哈希表中 buckets 的数量。它在我们创建HashMap类的对象时创建。 HashMap的初始容量为 2 4 ,即 16 。每次达到阈值时,HashMap的容量都会 加倍。容量增加到 2 5 = 32、2 6 = 64 ,依此类推。
假设我们有实现了hashCode()方法,该方法确保键值对在16个存储桶之间平均分配。
请考虑以下情形:
如果HashMap中有 16 个元素,则hashCode()方法将在每个存储桶中分配一个元素。在这种情况下,搜索任何项目都将进行查找。 如果HashMap中有 32 个元素,则hashCode()方法将在每个存储桶中分配两个元素。在这种情况下,搜索任何项目将最多进行两次查找。 类似地,如果HashMap中有 128 个元素,则hashCode()方法将在每个存储桶中分配八个元素。在这种情况下,搜索任何项目将最多进行 8 次查找。
我们可以从上述情况中观察到HashMap中的项目数是 两倍。每个存储区中的最大查找时间并没有增加太多,几乎保持 恒定
或者,哈希图以 2 n 的幂增长sup> ,并在起点达到极限时继续增长。

负载系数

负载系数是一种决定何时 <增强hashmap的能力以保持 O(1)的get()和put()操作复杂性。 HashMap的默认加载因子为 0.75f (Map大小的75%)。
问题
问题是,保持存储桶大小固定(即16),我们将继续增加Map中的项目总数,这会干扰时间复杂度。
解决方案
当我们增加存储桶总数时,每个存储桶中的总项开始增加。现在,我们可以在每个存储桶中保持恒定数量的项目,并保持get()和put()操作的O(1)时间复杂性。

负载系数如何计算

负载因子决定"何时增加存储桶数"。
我们可以使用以下公式找到何时增加哈希图大小:
哈希的初始容量*哈希的负载因子。
哈希图的初始容量为= 16
哈希图的默认加载因子为0.75
根据上述公式: 16 * 0.75 = 12
它表示哈希映射的第12个 个键值对将其大小保持为16。第13个 元素(键值对)将进入Hashmap,它将其大小从默认的 2 4 = 16 存储桶增加到 2 5 = 32 个桶。
另一种计算尺寸的方法:
当负载系数(m/n)在0.75时达到那时,哈希图会增加其容量。
其中,
m是哈希图中的条目数。
n是总大小

负载因子示例

让我们通过一个示例来了解负载因子。
我们知道默认的存储分区大小为哈希图是16。我们插入第一个元素,现在检查是否需要是否增加哈希图的容量。可以通过以下公式确定:
哈希的大小(m)/桶数(n)
在这种情况下,哈希图的大小为 1 ,存储区大小为 16 。因此, 1/16 = 0.0625 。现在将此值与默认的加载因子进行比较。
0.0625 <0.75
因此,无需增加哈希图大小。
我们不需要将哈希图的大小增加到第12 th 个元素,因为
12/16 = 0.75
此加载因子等于默认的加载因子0.75。
在哈希表中插入第13 th 元素后,哈希图的大小就会增加,因为:
13/16 = 0.8125
哪个大于默认哈希图大小。
0.8125> 0.75
现在我们需要增加哈希图的大小。
如果要保持get和put的复杂度O(1),建议将负载系数设为0.75左右

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4