为什么Java HashMap 1的最大容量<&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 31,即使int的最大值是2 31 -1?最大容量初始化为static final int MAXIMUM_CAPACITY = 1 << 30;
答案 0 :(得分:12)
Java使用有符号整数,这意味着第一位用于存储数字的符号(正/负)。
四字节整数具有32位,其中由于签名位,数字部分可能仅跨越31位。这将数字的范围限制为 2 ^ 31 - 1 (由于包含0)到 - (2 ^ 31)。
答案 1 :(得分:5)
虽然哈希映射可以处理2 ^ 30和2 ^ 31-1之间的项目数量而不必使用更大的整数类型,但编写的代码甚至可以在语言的整数类型的上限附近正常工作很难。此外,在一种将整数视为溢出“包裹”的抽象代数环的语言中,而不是作为能够产生数字正确结果或在不能这样做时抛出异常的数字,可能很难确保存在任何溢出都会导致无效操作未被发现的情况。
指定上限为2 ^ 30甚至2 ^ 29,并确保对不大于此值的事物的正确行为通常比尝试确保正确行为一直容易到2 ^ 31-1。如果没有特别的理由来挤出每一个范围,那么使用更简单的方法通常会更好。
答案 2 :(得分:3)
默认情况下, int
数据类型为 32位有符号二进制补码整数,其最小值为 {{1 <}> ,最大值 -2^31
,范围从-2,147,483,648到2,147,483,647。
第一位保留给符号位 - 如果数字为负则为1,如果为正则为0。
(2^31)-1
等于 1,073,741,824
它的二进制补码二进制整数是01000000-00000000-00000000-00000000。
1 << 30
等于 -2,147,483,648 。
它的二进制补码二进制整数是10000000-00000000-00000000-00000000。
它表示哈希映射可以扩展的最大大小为1,073,741,824 = 2 ^ 30。
答案 3 :(得分:0)
您正在考虑使用无符号,带符号的上限为(2 ^ 31)-1