【问题标题】:Hashmap hashtable size limit less than max allowed limit for array indexHashmap 哈希表大小限制小于数组索引的最大允许限制
【发布时间】:2016-05-07 01:20:36
【问题描述】:

我只是想验证我的以下理解,所以请提出建议。

在 Java 中,常规数组的索引可以达到 int 类型的最大值,即 2 raised to power 31 minus -1,并且由于 HashMap MAXIMUM_CAPACITY 也是 int,它也可以达到该值。

但由于 HashMap 内部需要表长度(存储桶大小)为 power of two 所以限制被缩减为 - static final int MAXIMUM_CAPACITY = 1 << 30; 因为该值是 nearest power of two1<<31 -1

我的理解正确吗?

所有答案here 仅提及符号位限制,但未提及power of two 要求,

/**
     * The table, resized as necessary. Length MUST Always be a power of two.
     */

transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;

另外,我了解arrayHashmap(存储桶大小)的大小限制与system / object / heap memory 限制无关,但max_range 仅适用于int 数据类型(索引数据类型)和其他逻辑要求(比如两个的幂等)。

【问题讨论】:

    标签: java collections


    【解决方案1】:

    您对数组大小的推理是正确的 (more or less)。

    但内部数组HashMap.table的大小限制不限制HashMap的大小(即可以存储在HashMap中的条目数)。

    该数组中的每个元素实际上是一个无限大小的 Entry 对象的链表,因此对可以存储在 HashMap 中的条目数量没有硬性限制。

    【讨论】:

      【解决方案2】:

      数组的限制是 2^^30,因为这是数组可以拥有的最大 2 次方。然而,没有理由建议哈希映射被限制在这个大小,而是在这个点附近哈希映射降级为链表的哈希(或 Java 8 中的树),即没有限制每个桶中的条目数。

      【讨论】:

        猜你喜欢
        • 2011-08-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        • 2011-10-24
        • 1970-01-01
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多