14

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

4

4 回答 4

15

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

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

于 2014-02-07T21:31:48.247 回答
7

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

指定 2^30 甚至 2^29 的上限,并确保不大于该上限的事物的正确行为通常比尝试确保正确行为一直到 2^31-1 要容易得多。如果没有特别的理由来挤出最后一点范围,通常最好使用更简单的方法。

于 2014-02-07T21:45:42.260 回答
3

默认情况下,int数据类型为32 位有符号二进制补码整数,最小值为-2^31,最大值为(2^31)-1,范围为 –2,147,483,648 到 2,147,483,647。

第一位是为符号位保留的——如果数字是负数,它是 1,如果是正数,它是 0。

1 << 30等于1,073,741,824
它的二进制补码二进制整数是 01000000-00000000-00000000-00000000。

1 << 31等于-2,147,483,648
它的二进制补码二进制整数是 10000000-00000000-00000000-00000000。

它说哈希映射可以扩展的最大大小是 1,073,741,824 = 2^30。

于 2014-10-07T19:02:28.137 回答
0

您正在考虑无符号,有符号上限为 (2^31)-1

于 2014-02-07T21:32:02.580 回答