为什么Object#hashCode()返回int而不是long

为什么不:

public native long hashCode(); 

代替:

 public native int hashCode(); 

更高的机会获得唯一的哈希码?

因为数组的最大长度是Integer.MAX_VALUE

由于hashCode()的主要用途是确定将对象插入HashMap / Hashtable的后备数组中的哪个插槽,因此哈希码> Integer.MAX_VALUE将无法存储在数组中。

无论如何,哈希码值将用于确定表中具有相对较小值的行数。

例如,在HashMap ,默认表包含256行仅16行(Sun JDK 1.6.0_17)。 这意味着行号的确定方式如下:

 int rowNumber = obj.hashCode() % rowsCount; 

因此,实际分布从0到rowsCount

UPD :我记得ConcurrentHashMap的实现。 简而言之, ConcurrentHashMap包含许多相对较小的表。 首先, hashCode函数用于确定表号,然后使用相同的函数来确定所选表中的行。

这种方法消除了数组大小的限制(甚至允许构建分布式哈希表)。

因此,我倾向于得出hashCode返回int的结论,因为它涵盖了绝大多数用例。

我假设它是计算成本与哈希范围的平衡。 Hashcodes经常被引用,每次需要哈希时推送两倍的数据会很昂贵,特别是如果考虑更常见的用例 –

例如 – 如果您创建一个包含10或100或1000个值的小哈希值,那么您将看到的哈希冲突数量的差异将极其微不足道。 对于较大的哈希,…好吧,想想10 ** 32值开始频繁冲突需要多大的哈希值,以及考虑到你需要的内存量,是否可以在JVM中做到这一点。