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

时间:2010-11-12 15:33:38

标签: java

为什么不:

public native long hashCode();

而不是:

public native int hashCode();

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

3 个答案:

答案 0 :(得分:23)

因为maximum length of an arrayInteger.MAX_VALUE

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

答案 1 :(得分:1)

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

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

int rowNumber = obj.hashCode() % rowsCount;

因此,实际分布从0到rowsCount

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

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

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

答案 2 :(得分:0)

我认为这是计算成本与哈希范围的平衡。经常引用Hashcodes,每次需要哈希值时,推送数据量的两倍会很昂贵,尤其是如果考虑更常见的用例 -

例如

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