代码之家  ›  专栏  ›  技术社区  ›  Sandeep Jindal

Java哈希代码和bucket大小-关系

  •  1
  • Sandeep Jindal  · 技术社区  · 13 年前

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

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

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

    2 回复  |  直到 13 年前
        1
  •  2
  •   Stephen C    13 年前

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

    您的问题的答案(部分)是针对具体实施的。

    1) 请参阅代码。注意,你关于如何 initialCapacity 是不正确的。。。至少适用于Oracle Java 6和7。明确地 初始容量 不一定是hashmap的数组大小。

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

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

    如果你真的在问Java中哈希表数据结构的设计,那么在普通大小的哈希表和巨大的哈希表的效率之间存在权衡;即具有明显多于 2^30 元素。这个 哈希图 实现被调整为最适合于正常大小的映射。如果您经常需要处理庞大的映射,并且性能至关重要,那么您应该考虑实现一个定制的映射类,该类可以根据您的特定需求进行调整。

        2
  •  2
  •   Patricia Shanahan    13 年前

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

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

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