java中hashcode的计算方法

来源:互联网 发布:淘宝店主认证页面 编辑:程序博客网 时间:2024/05/01 15:13
 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;     
  }
0 0
原创粉丝点击