Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么HashMap中更高的负载因子会增加查找成本?_Java_Hashmap_Hashtable_Hash - Fatal编程技术网

Java 为什么HashMap中更高的负载因子会增加查找成本?

Java 为什么HashMap中更高的负载因子会增加查找成本?,java,hashmap,hashtable,hash,Java,Hashmap,Hashtable,Hash,从HashMap的JavaDoc: 作为一般规则,默认负载系数(.75)提供了良好的性能 时间和空间成本之间的权衡。较高的值会降低成本 空间开销,但会增加查找成本(反映在大多数 HashMap类的操作,包括get和put) 如果我们有一个更高的值,为什么会增加查找成本?这与哈希表是如何在引擎盖下实现的有关,它使用哈希代码,而且由于计算哈希代码的算法并不完美,因此可能会发生一些冲突,增加负载因子会增加发生冲突的概率,从而降低查找性能…哈希表的定义如下 n/s,存储条目数n与表的存储桶数组大小s的比

HashMap
的JavaDoc:

作为一般规则,默认负载系数(.75)提供了良好的性能 时间和空间成本之间的权衡。较高的值会降低成本 空间开销,但会增加查找成本(反映在大多数 HashMap类的操作,包括get和put)


如果我们有一个更高的值,为什么会增加查找成本?

这与哈希表是如何在引擎盖下实现的有关,它使用哈希代码,而且由于计算哈希代码的算法并不完美,因此可能会发生一些冲突,增加负载因子会增加发生冲突的概率,从而降低查找性能…

哈希表的定义如下

n/s,存储条目数n与表的存储桶数组大小s的比率

当冲突数较低时,哈希表可以保持较高的性能。当加载因子较高时,存储相同数量的条目所需的哈希桶数量仍然较低,从而增加了冲突的概率。

默认加载因子(0.75)


在此,我们应首先了解容量和负载系数的含义:

容量:这是任何给定时间点上任何哈希表中的存储桶数。

负载因子:负载因子是在自动增加哈希表容量之前,允许哈希表达到的满度的度量

因此,在容量增加之前,哈希表占用的负载因子越多

  • 现在给出hashCode()的最佳可能实现,一个bucket中只有一个值,这里的查找成本将是最小的
  • 在最坏的情况下,所有值都将放在同一个存储桶中,查找成本将达到最大值
  • 在一般情况下,这当然取决于hashCode()实现,但这里要考虑的另一个因素是负载因素,因为集合占用的空间越大,冲突的可能性就越大,因此在非理想情况下,更高的负载因素会增加查找成本

负载系数0.75可以使用以下公式(n/s,存储条目的数量n与表格存储桶数组大小s的比率)进行解释:

假设您有75个值需要存储在哈希表中,并且有100个空数组块要存储它们,这里冲突的可能性最小化,负载因子为0.75

现在假设您有75个值要存储,只有10个空数组块(加载因子7.5),这意味着您将有冲突,并使用任何冲突解决技术,这将增加您的搜索时间

现在换一种方式,您有75个条目和1000个空数组块(加载因子0.075),这将导致大量的空块,这是大量的空间浪费

因此,经验法则是,随着负载因子值的增加,搜索时间将增加,当它接近0时,将浪费更多的存储空间


因此,这是一个时空权衡。

@PaulTomblin负载系数=存储桶大小/密钥数?如果是这种情况,那么碰撞应该减少,因为增加负载因子意味着增加分子中的数量,前提是键的数量保持不变。检查此[[1]:@user1613360你应该学会在评论中添加链接..顺便说一句,在提问之前我已经看到了这个答案。这是Javadoc的复制/粘贴。我认为这是序列号,因此产生了混淆。请参阅我对Paul Tomblin的评论。谢谢你澄清我的疑问。
If declare load factor as
1 the restructuring process only happens when number of elements are exceeding the capacity of the HashMap.