为什么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中做到这一点。