我一直在使用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; } }
搜索文档,本网站和Google的“netbeans生成哈希码”这样的东西没有什么似乎相关.有谁在这里熟悉这个世代战略是为什么Netbeans使用它?
编辑:
感谢您的答案!特别是由于this answer on the linked SO question,我了解了现在更全面地设计一个hashCode方法中使用素数的逻辑.然而,目前为止,没有人真正解决的问题的另一方面是Netbeans如何选择它为生成的方法所做的素数.哈希字段和其他乘数(在我的例子中为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; }
那么,为什么Netbeans选择这些特定的素数,而不是其他的?
解决方法
这是旨在更好地分配哈希值的优化. Eclipse也是这样做的.看看
Why use a prime number in hashCode?和
Why does Java’s hashCode() in String use 31 as a multiplier?.
这是没有必要的.甚至返回0;是为了满足equals / hashcode合同.唯一的原因是基于散列的数据结构在良好的分布式哈希值下表现更好.
有人会称之为过早优化.我想这是可以的,因为它的a)免费(生成)和b)广泛认可(几乎每个IDE都这样做).