我应该使用什么作为null的哈希码?

时间:2014-12-03 10:08:36

标签: java hash null hashcode hash-collision

假设我们有一个以下琐碎的课程:

public class Foo {

    public Integer bar;

}

我们想为它构建一个“好”的hashCode方法。例如,“好”我会意味着在“真实”情况下哈希码碰撞的可能性很小。

在这类课程的“真实生活”中,我会合理地期望Foobar设置为null0。我甚至认为这两个可能是最常见的价值观。

但是让我们来看看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是正常做法。

但这会为null0生成相同的哈希码,不是吗?我假设null0可能是最常见的案例 - 这会导致更高的可能性。[/ p>

所以这是我的问题。 hashCode的{​​{1}}值是多少?

3 个答案:

答案 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常量。