有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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 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(bucket size)的大小限制与system / object / heap memory限制无关,而只与int数据类型(索引数据类型)和其他逻辑要求(如二的幂等)有关


共 (2) 个答案

  1. # 1 楼答案

    关于数组大小的推理是(more or less)正确的

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

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

  2. # 2 楼答案

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