我们知道,hashCode()的默认实现在将对象的内部地址converting the internal address转换为整数后返回整数。因此,每个对象的内部内存是不同的,那么为什么hashCode()不生成唯一的hashcode.
我的问题是,如果我们不覆盖hashcode()和等于,为什么hashcode()返回整数(即对象的地址表示)不生成唯一的代码?
发布于 2014-11-04 16:32:32
因为它不能。
由于每个VM实例中只有2^32个不同的ints,并且可能有超过2^32个活动对象,因此在技术上不可能保证每个对象都有唯一的哈希代码。
即使默认哈希代码可能基于对象的内部地址,它也与内部地址不完全相同。
发布于 2014-11-04 16:30:21
为什么hashCode()不生成唯一的哈希码
因为它没有义务这么做..。
引用Object.hashCode()的javadoc
如果两个对象根据等于(,java.lang.Object)方法是不相等的,那么对两个对象调用hashCode方法必须产生不同的整数结果,这是不需要的。
事实上,这是一个完全合法(尽管无用)的hashCode实现:
@Override
public int hashCode()
{
return 42;
}.hashCode()方法的要求是,如果两个对象根据.equals()是相等的,那么它们对于.hashCode()的结果应该是相同的;而且上述方法符合要求!
请注意,在现实生活中,您永远不会编写像上面这样的无用的hashCode()方法.
注意默认实现,即Object的实现
hashCode()方法调用System.identityHashCode();equals()方法测试引用相等(也就是说,对于对象o1和o2,它测试该o1 == o2)。如果您仔细阅读Object的javadoc,您将看到这两种方法的契约都被遵守了;它的实现是您所能得到的最小值,但是契约是被遵守的。
发布于 2014-11-04 16:26:59
hashCode只在未被重写的情况下打印内部内存入口!(它使用对象实现)
字符串对象的哈希代码计算为
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]使用int算术,其中si是字符串的第一个字符,n是字符串的长度,^表示幂。(空字符串的哈希值为零。)
https://stackoverflow.com/questions/26740091
复制相似问题