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

2022-09-04 00:58:34

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


答案 1

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

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


答案 2

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

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