2016-01-29 45 views
0

我只是想验证我的下面的理解,所以请建议。哈希映射哈希表大小限制小于数组索引的最大允许限制

在Java中,规则排列可以有指数高达int类型,为2 raised to power 31 minus -1,自HashMapMAXIMUM_CAPACITYint过的最大值,它可以达到这个值了。

但由于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仅数据类型(索引数据类型)和其他逻辑要求(如两个幂等)。

回答

1

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

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

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

1

数组的限制是2 ^^ 30,因为这是数组中最大的两个数组。然而,没有理由认为散列映射仅限于这个大小,而是围绕这一点散列映射降级到链表(或Java 8中的树)的散列,即对每个存储桶中的条目数量。