loadFactor = 0.1是否使得HashMap真的比loadFactor = 0.6快,或者有一些下限使得loadFactor更小没有任何意义?

时间:2018-03-21 15:11:52

标签: java hashmap

loadFactor = 0.1是否使得HashMap真的比loadFactor = 0.6快,或者有一些下限使得loadFactor更小没有任何意义?

我的意思是如果我不关心内存消耗 - 如果只有速度(put / contains - 涉及查找相应的bucket / key(-value)的操作)很重要?

有一个共同的观点,即loadFactor应该在0.6 - 0.8之内,但为什么我从来没有听过人们认真地谈论0.1,0.2,0.05。

1 个答案:

答案 0 :(得分:0)

散列映射使其快速的唯一属性是散列函数的avalanche effect

哈希函数是我们所依赖的,无论该空间的大小如何,都可以利用给予hashmap的空间。

让我们看看案例,

案例1.高负载系数

高负载系数意味着当空间几乎满时,hashmap只会重新显示它的密钥。您可以看到,在这种情况下,只有散列函数良好时才会提高性能,否则,我们会将多个密钥放在同一个存储桶中。

案例2.低负载系数

低负载系数意味着hashmap经常需要分配内存以保持密钥空间尽可能宽。性能再次由散列函数而不是空间决定,因为散列函数必须在此空间上分配密钥。

请注意,此时性能因素不仅取决于键的分布情况,还取决于每次碰撞节省多少空间。有足够的空间,但该空间中的项目数量非常少意味着存储每个项目所需的内存量(至少)将为(1 / loadfactor)。那就是我们不会发生碰撞。

例如,如果hashmap存储字节并且总空间为100个字节,那么加载因子为0.1,每个1个字节的存储空间等同于{{在重新散列之前,可以存储1}个字节,并且只能存储最多10个项目。但是,如果发生碰撞,则此数字会增加。因此,如果我们得到两个项目冲突,那么我们只使用10桶中的9桶,因此事实证明存储每个项目所需的内存量恰好高于{{ {1}}字节。

最后,我建议使用Java一直推荐的内容(0.75)。我不太确定他们如何确定这个值,但它似乎达到了降低冲突(每个字节10字节)所产生的空间成本以及重新散列频率的最佳点。

这一切都指向散列函数 - 它可以使用给定空间的程度决定了散列映射的性能,以及我们对负载因子的影响程度。毕竟目标是完美哈希,其中加载因子为11,冲突为1.33

我建议你练习一个hashmap并调整它的加载因子,以及使用的哈希函数,以真正了解它的作用。