Java hashcode是一个整数(size 2 pow 32)
当我们创建一个哈希表/哈希映射时,它会创建大小等于Map的初始容量的桶。换句话说,它会创建一个大小为“初始容量”的数组
问题 1.它如何将密钥(java对象)的哈希码映射到桶索引? 2.由于hashmap的大小可以增长,hashmap的大小是否可以等于2 pow 32?如果回答是肯定的,那么拥有一个大小为2的数组32是明智的吗?
答案 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和获取存储区索引之前减少一些冲突源。