废话不说,直接上代码 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又有什么含义??

解决方案 »

  1.   

    31是第11位质数,
    1231,1237是第202,203位质数.
    Boolean的文档里写到:true的时候hasCode返回1231,
    false的时候返回1237,
    质数在进行Xor,乘法等运算的时候很少重复.
    至于为什么选1231和1237,可以换个问题,为什么不呢?
      

  2.   

    搂主要理解hashCode的含义。hashCode是为了提高比较两个对象不同而设置的,这个值随便怎么取都可以。注意当两个对象真的相同是靠equals来实现的。有点晕,那只有看源码。
      

  3.   

         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()是第二标准
        
      

  4.   

    呵呵,楼上的说反了吧?
    应该是先用hashcode快速比较出不同的,用equals再比较hashcode过滤出的相同的,只有equals返回ture,才真正认为对象相等。
    上面的话是经典哟,如果没有理解,估计hashcode的含义就没有理解,也不可能用好hashcode。