hashCode重载时的疑问, prime为啥是31而不是其他? boolean c ? 1231 : 1237又是什么含义?

Rooock 2009-04-02 12:58:00
废话不说,直接上代码

private int a;
private long b;
private boolean c;
private String d;


@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + (int) (b ^ (b >>> 32));
result = prime * result + (c ? 1231 : 1237);
result = prime * result + ((d == null) ? 0 : d.hashCode());
return result;
}


这里,一开始给final int prime = 31;是什么含义? 为什么是31,不是32,33或者其他??
(c ? 1231 : 1237); 这里的1231和1237又有什么含义??
...全文
533 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ty_tarena_pger 2009-04-02
  • 打赏
  • 举报
回复
4楼说的很对,我再补充下:
计算机中数据的比较可以分两种情况:
1>值比较(用equals()方法)
2>内存地址比较(用hashCode()方法)
当然上面的无论是equals()还是hashCode()你都可以重写

@Override
public int hashCode() //一般自定义的类的这个方法都是自己重写而不是用Eclipse工具生成
{
final int prime = 31; //这里的数字最好是一个质数,这里设计到一个哈希表的查找
int result = 1;
result = prime * result + a;
result = prime * result + (int) (b ^ (b >>> 32));
result = prime * result + (c ? 1231 : 1237);
result = prime * result + ((d == null) ? 0 : d.hashCode());
return result;
}



Set集合你应该知道吧:Set (不允许放重复值)
它的比较标准就是:
1>比较equls(),如果相等,就判定它们相等;
2>如果equls()不相等,就比较hashCode()
如果hashCode()相等,就判定这两个对象相等
否则不相等
equls()是判定得第一标准
hashCode()是第二标准
difficult 2009-04-02
  • 打赏
  • 举报
回复
搂主要理解hashCode的含义。hashCode是为了提高比较两个对象不同而设置的,这个值随便怎么取都可以。注意当两个对象真的相同是靠equals来实现的。有点晕,那只有看源码。
Steve 2009-04-02
  • 打赏
  • 举报
回复
基本没有什么规律,2进制只有3位不同,
为什么不是4位或者5位?
我猜是为了好记, 123打头,连续的两个质数.
Rooock 2009-04-02
  • 打赏
  • 举报
回复
是和二进制有关吗
31的二进制是 011111
1231二进制是 0101 0100 1111
1237二进制是 0101 0101 0101

会有什么规律吗? 我还没看出来...
difficult 2009-04-02
  • 打赏
  • 举报
回复
呵呵,楼上的说反了吧?
应该是先用hashcode快速比较出不同的,用equals再比较hashcode过滤出的相同的,只有equals返回ture,才真正认为对象相等。
上面的话是经典哟,如果没有理解,估计hashcode的含义就没有理解,也不可能用好hashcode。
Steve 2009-04-02
  • 打赏
  • 举报
回复
31是第11位质数,
1231,1237是第202,203位质数.
Boolean的文档里写到:true的时候hasCode返回1231,
false的时候返回1237,
质数在进行Xor,乘法等运算的时候很少重复.
至于为什么选1231和1237,可以换个问题,为什么不呢?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧