effective java中讲到的hashCode的算法

来源:百度文库 编辑:神马文学网 时间:2024/04/28 14:15:36
  1. 把某个非零常数值,比如说17,保存在一个叫result的int类型的变量中。  
  2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域),完成以下步骤:  
  a. 为该域计算int类型的散列码c:  
  i. 如果该域是boolean类型,则计算(f ? 0 : 1)   。  
  ii. 如果该域是byte、char、short或者int类型,则计算(int)   f。  
  iii. 如果该域是long类型,则计算(int)   (f^(f>>>32))。  
  iv. 如果该域是float类型,则计算Float.floatToIntBits(f)。  
  v.  如果该域是double类型,则计算Double.doubleToLongBits(f)得到一个long类型的值,然后  按照步骤2.a        .iii,对该long型值计算散列值。  
  vi.如果该域是一个对象引用,并且该类的equals方法通过递归调用equals的方式来比较这个域,则同样对这个域递归调用hashCode。如果要求一个更为复杂的比较,则为这个域计算一个“规范表示(canonical representation)”,然后针对这个范式表示调用hashCode。如果这个域的值为null,则返回0(或者其他某个常数,但习惯上使用0)。  
  vii.   如果该域是一个数组,则把每一个元素当做单独的域来处理。也就是说,递归地应用上述规则,对每个重要的元素计算一个散列码,然后根据步骤2.b中的做法把这些散列值组合起来。  
  b.按照下面的公式,把步骤a中计算得到的散列码c组合到result中:result   =result*37+c  
  3.返回result。  
  4.写完了hashCode方法之后,问自己“是否相等的实例具有相等的散列码”。如果不是的话,找出原因,并修正错误。  
  例如  
  public int hashCode()  
  {  
      int   result   =17;  
      result=result*37   +   width;  
      result=result*37   +   height;  
      return   result;    
  }