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()实现,但这里要考虑的另一个因素是负载因素,因为集合占用的空间越大,冲突的可能性就越大,因此在非理想情况下,更高的负载因素会增加查找成本
因此,这是一个时空权衡。@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.