当前位置: 首页 > 面试题库 >

不同初始容量和负载因子的HashMap的性能

郜杰
2023-03-14
问题内容

这是我的情况。我正在使用两个java.util.HashMap将一些常用数据存储在Tomcat上运行的Java
Web应用程序中。我知道每个Hashmap中的确切条目数。键分别是字符串和整数。

我的问题是,设置初始容量和负载系数的最佳方法是什么?

我是否应该将容量设置为等于其将要包含的元素数量,并将负载容量设置为1.0?我希望在不占用过多内存的情况下获得绝对最佳的性能。但是,恐怕该表无法最佳填充。使用所需大小的表格,会不会发生键冲突,导致(通常很短的)扫描来找到正确的元素?

假设(这是一个延伸),哈希函数是整数键的简单mod
5,这并不意味着键5、10、15会击中相同的存储桶,然后导致寻找来填充旁边的存储桶他们?更大的初始容量会提高性能吗?

另外,如果有比散列表更好的数据结构,我也完全同意。


问题答案:

在没有完善的数据散列功能的情况下,并假设这实际上不是对无关紧要的事情的微观优化,我将尝试以下操作:

假设在大多数情况下,HashMap使用的默认负载容量(.75)是一个很好的值。在这种情况下,您可以使用它,并根据自己对将要保存的项目数的了解来设置HashMap的初始容量-
对其进行设置,以使初始容量x .75 =项目数(向上取整)。

如果它是一个较大的映射,那么在高速查找非常关键的情况下,我建议使用某种Trie而不是哈希映射。对于长字符串,在大型地图中,可以通过使用更面向字符串的数据结构(例如trie)来节省空间和一些时间。



 类似资料:
  • 问题内容: 我应该传递什么值来为N个项目创建有效的/ 基于结构的结构? 在中,有效数字为N(N已假定未来增长)。a的参数应该是什么?((int)(N * 0.75d),0.75d)?更多?减?更改负载系数有什么影响? 问题答案: 关于负载因子,我将简单引用HashMap javadoc : 通常,默认负载因子(.75)在时间和空间成本之间提供了很好的折衷。较高的值会减少空间开销,但会增加查找成本(

  • 问题内容: 如何找到哈希表的当前负载率和容量? 问题答案: 您不应该能够获得负载系数和容量。它们是hashmap类的实现细节。但是,您可以使用反射。尽量避免使用它,但这通常是一个坏主意。

  • 有两个重要属性:和。我查阅了Java文档,它说是初始加载因子。但我找不到它的实际用途。 有人能描述一下我们需要设置负载因子的不同场景,以及针对不同情况的一些示例理想值是什么吗?

  • 问题内容: 所以我对Java中的s 有两个问题: 初始化a的正确方法是什么?我认为在我的情况下最好使用: 但是Eclipse一直建议我使用: 哪个更好? 可以将不同类型的对象/数据类型保存为值吗?例如,是否可以正常工作: 在第一个中,我想要一个a作为值​​,在第二个中,我想要一个字符串。用s 在Java中可以吗?另外,可以将a 作为值存储在?中吗? 问题答案: 这实际上取决于您需要哪种类型的安全性

  • 问题内容: 看到以下内容时,我正在浏览Java的HashMap源代码 我的问题是为什么这个要求首先存在?我还看到,允许使用自定义功能创建HashMap的构造函数将其转换为2的幂: 为什么容量总是必须是2的幂? 另外,执行自动重新哈希处理后,究竟会发生什么?哈希函数也改变了吗? 问题答案: 映射必须计算出将哪个内部表索引用于任何给定键,并将任何值(可能为负)映射到range中的值。when 是2的幂

  • 问题内容: 考虑以下示例代码: 初始化时的初始容量为7,然后下一行尝试将字符串“ Hello”添加到位置5。这将引发IndexOutOfBoundsException: 线程“主”中的异常java.lang.IndexOutOfBoundsException:索引:5,大小:0 我查看了有关ArrayList的“初始容量”的含义的问题。我知道这个特定的构造函数正在为7个String元素分配空间,如