java我应该使用什么作为null的哈希代码?
假设我们有一个简单的类:
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
可能是最常见的情况——这会导致更高的碰撞概率
所以我的问题来了什么是null
的好hashCode
值
# 1 楼答案
坚持使用Eclipse产生的任何东西,或者
0
如果测试或分析表明,将哈希代码更改为null可以提高性能,那么就试试吧。将其更改为任意常数
# 2 楼答案
摘自Joshua Bloch的优秀著作《有效的Java》,第二版(第49页):
所以你可以使用你选择的任何常数,但是通常,
0
被用作null
的哈希代码在经常出现0的情况下,选择一个不同于0的常数(在字段中显示为无效值的常数)可能确实会更好,以避免冲突