繁体   English   中英

为什么哈希码不生成唯一的哈希码?

[英]Why hashcode does not generate unique hashcode?

我们知道,hashCode()的默认实现在将内部地址转换为对象的内部地址后转换为integer。 因此,每个对象的内部存储器都不同, 这就是为什么hashCode()不会生成唯一的哈希码的原因。

我的问题是,如果我们不重写hashcode()并等于它,为什么hashcode()[返回整数即对象的地址表示形式]不会生成唯一代码?

为什么hashCode()不生成唯一的哈希码

因为它没有义务这样做...

引用Object.hashCode()的javadoc:

不是必需的:如果两个对象根据equals(java.lang.Object)方法是不相等的,然后调用hashCode方法在各两个对象的必须产生不同的整数结果。

确实,这是一个完全合法(即使无用)的hashCode实现:

@Override
public int hashCode()
{
    return 42;
}

需要进行什么.hashCode()方法是,如果两个对象根据相等.equals()则它们应具有相同的结果.hashCode() ; 以上方法很合适!

提醒您,在现实生活中,您永远不会像上面那样编写无用的hashCode()方法。


注意默认的实现,即Object

  • 它的hashCode()方法调用System.identityHashCode() ;
  • 它的equals()方法测试引用相等性(即对于对象o1o2 ,它测试o1 == o2 )。

如果您仔细阅读Object的javadoc,您会发现这两个方法的合同均得到遵守。 它的实现尽可能地少,但是必须遵守合同。

因为它不能。

由于只有2 ^ 32个不同的int,并且在任何VM实例中可能有2 ^ 32个以上的活动对象,因此从技术上讲,不可能为每个对象保证唯一的哈希码。

即使默认哈希码可能基于对象的内部地址,也与内部地址不同。

hashCode仅在未覆盖内部内存地址的情况下才打印! (它使用对象实现)

字符串对象的哈希码计算为

 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用int算术,其中s [i]是字符串的第i个字符,n是字符串的长度,^表示幂。 (空字符串的哈希值为零。)

对象的哈希码不是其内存地址。 如果您需要为实例使用唯一的整数,则有一个特殊的方法称为System.identityHashCode(Object)

哈希码只是一个整数(32位),旨在给出合理的近似值。 如果两个哈希码不同,则两个对象必须不同,但是如果它们相同,则它们可能仍然不同(尽管通常它们是相同的)。

这意味着,如果您具有内容完全相同的两个不同列表,则它们将具有相同的哈希码,但具有不同的内存地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM