Hashmap哈希表大小限制小于数组索引

时间:2016-01-29 10:32:28

标签: java collections

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

在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 two到{{1} }。

我的理解是否正确?

所有答案here仅提及符号位限制,但未提及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; array(存储区大小)的大小限制与Hashmap限制无关,但仅限system / object / heap memory数据类型的max_range(索引)数据类型)和其他逻辑要求(如2的幂等)。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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