假设我们有一个以下琐碎的课程:
public class Foo {
public Integer bar;
}
我们想为它构建一个“好”的hashCode
方法。例如,“好”我会意味着在“真实”情况下哈希码碰撞的可能性很小。
在这类课程的“真实生活”中,我会合理地期望Foo
将bar
设置为null
或0
。我甚至认为这两个可能是最常见的价值观。
但是让我们来看看Eclipse产生的结果:
public class Foo {
public Integer bar;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((bar == null) ? 0 : bar.hashCode());
return result;
}
}
而且不仅仅是Eclipse,似乎使用0
作为hashCode
null
是正常做法。
但这会为null
和0
生成相同的哈希码,不是吗?我假设null
和0
可能是最常见的案例 - 这会导致更高的可能性。[/ p>
所以这是我的问题。 hashCode
的{{1}}值是多少?
答案 0 :(得分:1)
来自Joshua Bloch的优秀书籍 Effective Java,2nd Edition (第49页):
如果该字段的值为
null
,则返回0
(或其他常量,但0
是传统的。)
因此,您可以使用您选择的任何常量,但通常0
用作null
的哈希码。
在你的情况下,频繁出现0时,选择一个不同于0的常数(一个在你的字段中不显示为有效值的常量)可能确实更好,以避免碰撞。
答案 1 :(得分:1)
找到一个不经常出现的常数可能很困难。您可以使用negative constant
来避免与null冲突。
答案 2 :(得分:1)
坚持使用Eclipse生成的任何内容,或0
。
如果测试或分析显示更改null的哈希代码会提高性能,请选择它。将其更改为任何arbritrary常量。