为什么Java HashMap的最大容量是1<&书信电报;30而不是1<&书信电报;31?

为什么Java HashMap的最大容量是1<&书信电报;30而不是1<&书信电报;31?,java,hashmap,capacity,Java,Hashmap,Capacity,为什么Java HashMap的最大容量1Java使用有符号整数,这意味着第一位用于存储数字的符号(正/负) 一个四字节整数有32位,其中由于符号位,数字部分只能跨越31位。这将数字的范围限制为2^31-1(由于包含0)到-(2^31)您正在考虑的是无符号,有符号上限为(2^31)-1,而哈希映射可以处理2^30到2^31-1之间的项目数量,而无需使用较大的整数类型,编写即使接近语言整数类型上限也能正常工作的代码是很困难的。此外,在一种将整数视为溢出时“包裹”的抽象代数环的语言中,而不是将其视为

为什么Java HashMap的最大容量1Java使用有符号整数,这意味着第一位用于存储数字的符号(正/负)


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

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

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


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

默认情况下,
int
数据类型是一个32位带符号的二补整数,其最小值为
-2^31
,最大值为
(2^31)-1
,范围从-2147483648到2147483647。

第一位保留给符号位-如果数字为负,则为1;如果数字为正,则为0。


1有符号整数的范围为2^31-1到-(2^31)。请记住,为符号保留一位。answers perfect,thanksBesides,其中2**31为20亿,每个哈希项本身需要一个对象,一个对象用于键,一个对象用于值。最小对象大小通常约为24字节,因此在为任何其他项分配空间之前,将为1440亿字节在应用程序中。可以肯定地说,最大容量限制只是理论上的限制。它甚至不是理论上的限制。这只是最大的存储桶数。内容没有限制,每个存储桶可以容纳一个无界(根据API,系统地址空间限制了指向不同对象的可能指针的数量…)具有冲突散列的条目数。在许多情况下,高阶散列位也是“可疑”的。这是错误的。请参阅Integer.MAX_值:它是2^31-1,即2147483647。这是错误的。1