首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么hashcode不生成唯一的hashcode?

为什么hashcode不生成唯一的hashcode?
EN

Stack Overflow用户
提问于 2014-11-04 16:24:44
回答 4查看 1.3K关注 0票数 1

我们知道,hashCode()的默认实现在将对象的内部地址converting the internal address转换为整数后返回整数。因此,每个对象的内部内存是不同的,那么为什么hashCode()不生成唯一的hashcode.

我的问题是,如果我们不覆盖hashcode()和等于,为什么hashcode()返回整数(即对象的地址表示)不生成唯一的代码?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-04 16:32:32

因为它不能。

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-11-04 16:30:21

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

因为它没有义务这么做..。

引用Object.hashCode()的javadoc

如果两个对象根据等于(,java.lang.Object)方法是不相等的,那么对两个对象调用hashCode方法必须产生不同的整数结果,这是不需要的。

事实上,这是一个完全合法(尽管无用)的hashCode实现:

代码语言:javascript
复制
@Override
public int hashCode()
{
    return 42;
}

.hashCode()方法的要求是,如果两个对象根据.equals()是相等的,那么它们对于.hashCode()的结果应该是相同的;而且上述方法符合要求!

请注意,在现实生活中,您永远不会编写像上面这样的无用的hashCode()方法.

注意默认实现,即Object的实现

  • 它的hashCode()方法调用System.identityHashCode()
  • 它的equals()方法测试引用相等(也就是说,对于对象o1o2,它测试该o1 == o2)。

如果您仔细阅读Object的javadoc,您将看到这两种方法的契约都被遵守了;它的实现是您所能得到的最小值,但是契约是被遵守的。

票数 2
EN

Stack Overflow用户

发布于 2014-11-04 16:26:59

hashCode只在未被重写的情况下打印内部内存入口!(它使用对象实现)

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

代码语言:javascript
复制
 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26740091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档