要问:
就像 equals() 一样,对于 hashCode() 方法也有官方要求,写在 Oracle 文档中:
如果两个对象相等(即 equals() 方法返回 true),它们必须具有相同的哈希码。
否则,我们的方法将毫无意义。正如我们所说,检查 hashCode() 应该首先提高性能。如果哈希码不同,检查将返回 false,即使对象实际上是相等的(根据我们在 equals() 方法中的定义)。
如果在同一个对象上多次调用 hashCode() 方法,则每次都必须返回相同的数字。
规则 1 反其道而行之。两个不同的对象可以有相同的哈希码。
我很困惑帮我弄清楚:
为什么在规则 3 中写到规则 1 在相反的方向上不起作用?
事实证明 1 规则 2 对象是相等的,并且它们具有相同的哈希码。
而且第三条规则也是2个对象的哈希码相同,还是我不太明白?为什么在规则 1 中写的是 2 个对象相等,而在规则 3 中,可以为两个不同的对象编写相同的哈希码,如何理解不同的对象?
注意: 假设该类已覆盖
hashCode().需要注意的是,不同的对象应该有不同的哈希码。但在实践中,有时情况会有所不同。这通常是由于计算哈希码的公式不完善造成的。
例子:一个字符串的哈希是由字符串的长度计算的:
length*3. 然后字符串foo和具有bar相同的哈希值。通常,使用哈希码是为了能够确定对象是不同的。但并不是说它们是一样的。相同的哈希码不能保证相同的对象。
它通常用于比较对象:
假设您有一个具有许多字段的对象。在大多数情况下,要比较的对象是不相等的。为了不比较一堆变量(如果对象不相等),可以先比较hashcode(因为如果hash不同,那么对象完全不同)。如果哈希值不同,则无法再比较变量。如果它们相同,那么您需要比较变量(因为如果哈希相同,这并不意味着对象相同)。
好吧,最后一个 - 几乎总是方法的返回类型
hashCode()-int。有int一定的限制(从-21 ...到+21 ...如果我没记错的话)。如果有比这个限制更多的不同对象,那么物理上不可能为所有对象生成不同的哈希值。也就是说,在使用哈希时,可以提高程序的性能。我将尝试解释规则: