哈希映射哈希表大小限制小于数组索引允许的最大限制



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

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

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

我的理解正确吗?

这里的所有答案都只提到符号位限制,但没有提到两个要求的幂,

/**
     * 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数据类型(索引数据类型)和其他逻辑要求(如 2 的幂等)。

你(或多或少)对数组大小的推理是正确的。

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

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

数组

的限制是 2^^30,因为这是数组可以拥有的 2 的最大幂。 但是,没有理由建议哈希映射仅限于此大小,而是在这一点上,哈希映射降级为链表的哈希(或Java 8中的树),即每个存储桶中的条目数量没有限制。

最新更新