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
是如何工作的。不需要猜测。