什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
我已经阅读了过去几个小时的哈希码函数,并且在自定义哈希码实现中使用素数作为乘数已经积累了一些问题.如果我能对以下问题有所了解,我将不胜感激:
在对@ mattb的答案的评论中,@ hstoerr主张使用更大的素数(例如524287)而不是公共素数31.我的问题是,给定一对或元素的哈希码函数的以下实现:
@Override
public int hashCode() {
final int prime = 31;
int hash1 = (pg1 == null) ? 0 : pg1.hashCode();
int hash2 = (pg2 == null) ? 0 : pg2.hashCode();
return prime * (hash1 ^ hash2);
}
Run Code Online (Sandbox Code Playgroud)这不会导致返回的溢出,int如果prime是大数?
假设溢出是没有问题的(JVM做一个自动施法)是它更好地做一个位位移,而不是一个演员?
我认为哈希码函数的性能根据哈希码的复杂性而有很大差异.主乘数的大小是否不影响性能?
在自定义哈希码函数中使用多个素数而不是单个乘法器更好/更智能/更快?如果没有,还有其他一些优势吗?请参阅@ jinguy对相关问题的回答中的示例:
public int hashCode() {
return a * 13 + b.hashCode() * 23 + (c? 31: 7);
}
Run Code Online (Sandbox Code Playgroud)其中a是一个int,b是一个 …