【问题标题】:Java hashcode and bucket size - RelationshipJava 哈希码和桶大小 - 关系
【发布时间】:2013-02-08 18:54:36
【问题描述】:

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

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

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

【问题讨论】:

  • 看看java HashMap 类(源代码)。你会得到答案。

标签: java data-structures hash hashmap


【解决方案1】:

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

【讨论】:

  • 这是否意味着一个桶只会映射一个哈希码,而只有当两个对象获得相同的哈希码并因此映射到同一个桶时才会发生冲突?
【解决方案2】:

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

HashMap 使用两个数组大小的幂,所以它可以使用的最大可能是 2^31。你需要一个大的物理内存才能使这个合理。

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

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多