提问者:小点点

Java哈希码和桶大小-关系


Javahashcode是一个整数(大小2 pow 32)

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

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


共2个答案

匿名用户

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

你的问题的答案(部分)是具体实现的。

1)查看代码。请注意,您对和/code>如何实现的假设是不正确的…至少对于OracleJava6和7。具体来说,和/code>不一定是hashmap的数组大小。

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

3)"……拥有一个大小为2^32的数组是明智的?"对于目前定义的Java是不可能的,尝试做一些不可能的事情是不明智的。

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

匿名用户

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

HashMap使用两种数组大小的幂,因此它可以使用的最大值可能是2^31。您需要很大的物理内存才能使其合理。

HashMap在执行简单的按位与获取桶索引之前,会执行一系列移位和异或操作以减少一些冲突源。