Java哈希码和桶大小 - 关系

时间:2013-02-23 02:25:57

标签: java data-structures hash hashmap

Java hashcode是一个整数(size 2 pow 32)

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

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

2 个答案:

答案 0 :(得分:2)

以下是当前源代码的链接: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个元素的地图。 HashMap实现被调整为最适合正常大小的地图。如果你经常不得不处理巨大的地图,并且性能至关重要,那么你应该寻求实现一个根据你的特定要求调整的自定义地图类。

答案 1 :(得分:1)

Java数组的大小实际上仅限于Integer.MAX_VALUE元素,2 ^ 31-1。

HashMap使用两种数组大小的功率,因此可能使用的最大值是2 ^ 31。你需要一个大的物理内存来使它合理。

HashMap执行一系列shift和xor操作,以便在执行简单的按位AND和获取存储区索引之前减少一些冲突源。