使用hashCode为HashMap返回巨大的整数ID

4

HashMap在内部使用固定长度的数组,并且存储值的索引是基于key的哈希值计算的,如果哈希冲突,则会在该索引上创建一个链表,然后在读取时使用equals方法返回正确的值。

我有一个自定义类,其中包含一个连续数字的Integer id,我将此类用作HashSet中的'key',并且在hasCode()方法中返回id,这意味着HashSet的底层数组将查找从hasCode()返回的索引号N来存储值。

现在,即使我从hashCode()返回Integer.MAX_VALUE - 1HashMap仍能够将该值存储在映射中。问题是,Integer.MAX_VALUE -1是否被用作底层数组的索引?如果是,HashMap在创建实例时是否会创建那么大的数组?

1个回答

3
不是这样的。HashMap最初会分配一个16个元素的数组,然后根据装载因子进行调整大小。因此,如果哈希码返回的整数无法适应该数组甚至是负数,那么可以使用一个简单的机制,比如取模的绝对值。简化形式如下:
 int arrayIndex = abs(hashCode) % arraySize; 

抱歉,“可能是”在这里表示纯粹的猜测。哈希表不是那样工作的。 - Gyro Gearless
1
实际上,这是一个简化但准确描述了HashMap如何工作的描述,根据官方文档和源代码,@Gyro Gearless。不需要猜测。 - Lew Bloch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接