有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我们有一个简单的类:

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作为hashCodenull是一种正常的做法

但这会为null0产生相同的哈希码,不是吗?因为我假设null0可能是最常见的情况——这会导致更高的碰撞概率

所以我的问题来了什么是null的好hashCode


共 (2) 个答案

  1. # 1 楼答案

    坚持使用Eclipse产生的任何东西,或者0

    如果测试或分析表明,将哈希代码更改为null可以提高性能,那么就试试吧。将其更改为任意常数

  2. # 2 楼答案

    摘自Joshua Bloch的优秀著作《有效的Java》,第二版(第49页):

    If the value of the field is null, return 0 (or some other constant, but 0 is traditional).

    所以你可以使用你选择的任何常数,但是通常,0被用作null的哈希代码

    在经常出现0的情况下,选择一个不同于0的常数(在字段中显示为无效值的常数)可能确实会更好,以避免冲突