Java 哈希码和桶大小 - 关系

标签 java data-structures hash hashmap

Java 哈希码是一个整数(大小为 2 pow 32)

当我们创建哈希表/ HashMap 时,它会创建大小等于 map 初始容量的桶。换句话说,它创建了一个大小为“初始容量”的数组

问题 1. 它如何将键(java 对象)的哈希码映射到桶索引? 2、既然hashmap的size是可以增长的,那么hashmap的size可以等于2 pow 32吗?如果答案是肯定的,那么拥有一个大小为 2 pow 32 的数组是明智的吗?

最佳答案

这是当前源代码的链接:http://www.docjar.com/html/api/java/util/HashMap.java.html

您问题的答案(部分)是特定于实现的。

1) 查看代码。请注意,您关于 initialCapacity 实现方式的假设是不正确的……至少对于 Oracle Java 6 和 7。具体来说,initialCapacity 不一定是 hashmap 的数组大小。

2) HashMap的大小就是条目的个数,可以超过2^32!我假设您实际上是在谈论容量。 HashMap 数组的大小理论上限制为 2^31 - 1(Java 数组的最大大小)。对于当前的实现,MAX_CAPACITY 实际上是 2^30;看代码。

3) “...拥有一个大小为 2^32 的数组是明智的吗?” 目前定义的 Java 是不可能的,它是尝试做不可能的事情是不明智的。

如果您真的要问 Java 中哈希表数据结构的设计,那么在正常大小的哈希表和巨大的哈希表的效率之间存在权衡;即包含明显超过 2^30 元素的 map 。 HashMap 实现被调整为最适合正常大小的 map 。如果您经常需要处理巨大的 map ,并且性能至关重要,那么您应该寻求实现一个根据您的特定要求进行调整的自定义 map 类。

关于Java 哈希码和桶大小 - 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15036327/

相关文章:

java - 如何实现贪心搜索算法

c# - 通过多个 TransformBlock 进行并行哈希计算会导致困惑

Java EE 架构 - CDI Beans 属于哪里?

java - JTable 中的重音在 Eclipse 中显示,但在 .jar 中不显示

java - 无法触发p :calendar's selectListener

url - 为什么Google搜索会使用客户端网址参数?

c# - 如何为按值比较的类编写良好的 GetHashCode() 实现?

javascript - 将数据动态添加到 javascript map

java - 制作一个智能监听器通知程序以避免到处重复代码

.net - 我应该使用哪种 .NET 数据结构?