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

Java:HashMap的大小是“素数”还是“ 2的幂”?

唐永春
2023-03-14
问题内容

许多书籍和教程都说,哈希表的大小必须是素数,才能在所有存储桶中平均分配密钥。但是Java
HashMap总是使用大小为2的幂。它不应该使用素数吗?哈希表的大小最好是“素数”还是“ 2的幂”?


问题答案:

使用2的幂可以有效地屏蔽哈希码的最高位。因此,在这种情况下,劣质哈希函数的性能可能会特别差。

Java
HashMap通过不信任对象的hashCode()实现并对结果进行第二级哈希处理来缓解这种情况:

将补充哈希函数应用于给定的hashCode,以防止质量差的哈希函数。这很关键,因为HashMap使用2的幂的哈希表,否则哈希表在低位无差异时会遇到冲突。

如果您具有良好的哈希函数,或执行类似的HashMap操作,则是否使用质数等作为表大小都没有关系。

另一方面,如果哈希函数的质量未知或质量较差,那么使用质数将是更安全的选择。但是,这将使实现动态大小的表变得更加棘手,因为突然之间,您需要能够产生质数,而不仅仅是将大小乘以一个常数。



 类似资料:
  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。

  • 问题内容: 编写HTML5文档类型时,正确的方法是什么? 要么 问题答案: 在HTML中,DOCTYPE不区分大小写。以下DOCTYPE均有效: 在XML序列化(即XHTML)中,不需要DOCTYPE,但是如果使用它,则应大写: 请参阅 HTML5的XML序列化,又名“XHTML5”: 请注意,如果您不在XHTML文档中使用大写字母,则XML解析器将返回语法错误。 第二部分可以用小写(),大写()

  • 问题内容: 在CSS中设置字体大小时,我应该使用百分比值()还是?您能解释一下优势吗? 问题答案: 他们的结论是: 显示的大小和以ems为单位的行高以及在正文中指定的百分比(以及Safari 2的可选警告)可在当今所有常用的浏览器中提供准确,可调整大小的文本。您可以将这种技术放入工具包中,并将其用作在CSS中调整文本大小的最佳方法,该方法可以使设计人员和读者满意。

  • 问题内容: 我在多个地方读到,管道的默认缓冲区大小为4kB(例如,在此处),我倾向于确认该语句: 但是,当我使用一个小程序来测试缓冲区大小时(通过写入shell直到write()块),我看到了64kB的限制! 看到这个程序: 及其输出: 强烈建议shell缓冲区的大小实际上是64k!这是怎么回事? 问题答案: 其他答案告诉您管道大小为64 KB。PIPE_BUF为4KB的原因是PIPE_BUF是最

  • 在深入研究CSS单元时,我遇到了参考像素的定义。然而,我无法找到一个关于它与CSS像素单元的关系的一致和全面的描述。我对这件事做了一些研究,但对我来说还是有点不清楚。 像素有两种不同的类型/定义: “设备像素”-显示器上的单个物理点。 和: CSS像素-与参考像素最匹配的单位。[1] 两个名字相同的平行概念绝对不能澄清混淆。我完全明白介绍第二个的目的,但我觉得它的命名有误导性。CSS像素被分类为绝

  • 问题内容: 哪种类型(浮点型或十进制)最适合将价格存储在mysql数据库中? 问题答案: 浮点数不精确,可能会导致累积舍入误差。十进制是必须准确的财务信息的最佳格式。