java Hashmap哈希表大小限制小于数组索引允许的最大限制
我只是想验证我下面的理解,所以请提出建议
在Java中,正则数组的索引可以达到int
类型的最大值,即2 raised to power 31 minus -1
,并且由于HashMap
{int
,所以它也可以达到该值
但由于HashMap
内部需要表长度(bucket size)为power of two
,因此限制被缩减为-static final int MAXIMUM_CAPACITY = 1 << 30;
,因为该值为nearest power of two
到1<<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;
此外,我理解array
或Hashmap
(bucket size)的大小限制与system / object / heap memory
限制无关,而只与int
数据类型(索引数据类型)和其他逻辑要求(如二的幂等)有关
# 1 楼答案
关于数组大小的推理是(more or less)正确的
但是内部数组
HashMap.table
的大小限制并不限制HashMap
的大小(即可以存储在HashMap中的条目数)该数组中的每个元素实际上都是一个无限大小的条目对象的链接列表,因此对于可以存储在HashMap中的条目数量没有硬性限制
# 2 楼答案
数组的限制为2^^30,因为这是一个数组的最大二次幂。但是,没有理由建议将哈希映射限制为该大小,而是在这一点上,哈希映射降级为链表(或Java 8中的树)的哈希,即每个bucket中的条目数没有限制