[英]Why hashcode does not generate unique 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()
方法测试引用相等性(即对于对象o1
和o2
,它测试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.