为什么Netbeans以它的方式生成hashCode()?

Ker*_*eph 14 java netbeans hashcode

我已经用Netbeans开发了一段时间的Java,并且有些事情我只是依赖于工作而没有真正质疑如何.其中包括自动生成的hashCode()和equals()方法.

equals方法很容易遵循,但我发现hashCode方法有些神秘.我不明白为什么它选择乘数并应用它所做的操作.

import java.util.Arrays;
import java.util.Objects;

public class Foo {

    int id;
    String bar;
    byte[] things;

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 89 * hash + this.id;
        hash = 89 * hash + Objects.hashCode(this.bar);
        hash = 89 * hash + Arrays.hashCode(this.things);
        return hash;
    }    
}
Run Code Online (Sandbox Code Playgroud)

搜索文档,这个网站和谷歌搜索"netbeans生成哈希码"之类的内容,似乎没有任何相关内容.有谁在这里熟悉这一代策略是什么以及为什么Netbeans使用它?

编辑:
感谢您的答案到目前为止!特别是由于对链接的SO问题的这个答案,我理解现在更充分地使用素数来设计hashCode方法的逻辑.然而,到目前为止我没有真正解决的问题的另一个方面是Netbeans如何以及为什么选择它为其生成的方法所做的素数.的hash字段,另一个乘法器(89在我的例子)似乎取决于类的各种因素是不同的.

例如,如果我String在类中添加第二个,则hashCode()变为

public int hashCode() {
    int hash = 7;
    hash = 13 * hash + this.id;
    hash = 13 * hash + Objects.hashCode(this.bar);
    hash = 13 * hash + Objects.hashCode(this.baz);
    hash = 13 * hash + Arrays.hashCode(this.things);
    return hash;
}
Run Code Online (Sandbox Code Playgroud)

那么,为什么Netbeans会选择这些特定的素数而不是其他素数?

ata*_*man 4

这是一项旨在更好地分配哈希值的优化。Eclipse 也做类似的事情。看看为什么在 hashCode 中使用素数?为什么Java的String中的hashCode()使用31作为乘数?

这绝不是必需的。Evenreturn 0;足以满足 equals/hashcode 契约。唯一的原因是基于散列的数据结构在良好的分布式散列值的情况下表现更好。

有些人会称之为过早优化。我想这没什么问题,因为它 a) 免费(生成)和 b) 被广泛认可(几乎每个 IDE 都这样做)。