为什么Java HashMap的最大容量为1 << 30而不是1 << 31?

tes*_*k03 14 java hashmap capacity

为什么Java HashMap的最大容量为1 << 30而不是1 << 31,即使int的最大值是2 31 -1?最大容量初始化为static final int MAXIMUM_CAPACITY = 1 << 30;

ini*_*mfs 12

Java使用有符号整数,这意味着第一位用于存储数字的符号(正/负).

四字节整数具有32位,其中由于签名位,数字部分可能仅跨越31位.这将数字的范围限制为2 ^ 31-1(由于包含0)到- (2 ^ 31).


sup*_*cat 5

虽然哈希映射可以处理2 ^ 30和2 ^ 31-1之间的项目数量而不必使用更大的整数类型,但编写即使在语言的整数类型的上限附近也能正常工作的代码是困难的.此外,在一种将整数视为溢出"包裹"的抽象代数环的语言中,而不是作为能够产生数字正确结果或在不能这样做时抛出异常的数字,可能很难确保存在任何溢出都会导致无效操作未被发现的情况.

指定上限为2 ^ 30或甚至2 ^ 29,并确保对不大于此的事物的正确行为通常比尝试确保正确行为一直容易到2 ^ 31-1.如果没有特别的理由来挤出每一个范围,那么使用更简单的方法通常会更好.