我们知道hashCode()的默认实现在将对象的内部地址converting the internal address转换为整数后返回整数。所以每个对象的内部存储器都不同,然后为什么hashCode()不会生成唯一的哈希码。
我的问题是为什么hashcode()[它返回一个对象的地址表示的整数]如果我们不覆盖hashcode()和equals,那么它不会生成唯一的代码?
答案 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()
方法测试引用相等性(即对象o1
和o2
,它测试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位),旨在给出一个合理的相等近似值。如果两个哈希码不同,则两个对象必须不同,但如果它们相同,则它们可能仍然不同(尽管通常它们是相同的)。
这意味着如果您有两个具有完全相同内容的不同列表,它们将具有相同的哈希码,但具有不同的内存地址。