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

时间:2014-11-04 16:24:44

标签: java hashcode

我们知道hashCode()的默认实现在将对象的内部地址converting the internal address转换为整数后返回整数。所以每个对象的内部存储器都不同,然后为什么hashCode()不会生成唯一的哈希码。

我的问题是为什么hashcode()[它返回一个对象的地址表示的整数]如果我们不覆盖hashcode()和equals,那么它不会生成唯一的代码?

4 个答案:

答案 0 :(得分:2)

  

为什么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,您将看到两种方法的合同都得到遵守;它的实施是尽可能少的,但合同是遵守的。

答案 1 :(得分:1)

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

String对象的哈希码计算为

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

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

答案 2 :(得分:1)

因为它不能。

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

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

答案 3 :(得分:-1)

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

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

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