Java 使用hashCode为HashMap返回大整数ID

Java 使用hashCode为HashMap返回大整数ID,java,hashmap,Java,Hashmap,HashMap在内部使用固定长度数组,存储值的索引基于键的哈希值,如果哈希值发生冲突,它将在该索引上创建一个链表,然后在读取时使用equals方法返回正确的值 我有一个自定义类,它有一个整数id作为序列号,我使用这个类作为HashSet的'key',并在hasCode()方法中返回id,这意味着HashSet的底层数组将查找我从hasCode()返回的索引号N以存储值 现在,即使我从hashCode()返回Integer.MAX_值-1,HashMap也能够将值存储在映射中。问题是,Intege

HashMap
在内部使用固定长度数组,存储值的索引基于
键的哈希值,如果哈希值发生冲突,它将在该索引上创建一个链表,然后在读取时使用
equals
方法返回正确的值

我有一个自定义类,它有一个
整数
id作为序列号,我使用这个类作为HashSet的
'key'
,并在
hasCode()
方法中返回id,这意味着
HashSet
的底层数组将查找我从
hasCode()返回的索引号N
以存储值


现在,即使我从
hashCode()
返回
Integer.MAX_值-1
HashMap
也能够将值存储在映射中。问题是,
Integer.MAX_VALUE-1
是否用作底层数组的索引?如果是,当我们创建它的实例时,
HashMap
是否创建了那个巨大的数组

不,情况并非如此。Hashmap最初会分配16个元素的数组,然后根据加载因子调整大小。因此,如果散列码返回的整数不适合该数组,甚至是负数,有一种简单的机制可以像mod的绝对值一样使用。以简化形式:

 int arrayIndex = abs(hashCode) % arraySize; 

对不起,“可能”在这里表示纯粹的猜测。散列表不是这样工作的。事实上,根据官方文档和来源@Gyro Gearless,这是一个简化但准确的描述,
HashMap
是如何工作的。不需要猜测。