Be alaways javaing...

Loving Java
posts - 43, comments - 5, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java中equals() hashcode()方法

Posted on 2008-08-04 14:38 追风舞者 阅读(190) 评论(0)  编辑  收藏 所属分类: J2SE

      Java语言中的equals的规范:

          1. 自反性:对于任何一个非空引用xx.equals(x)应该返回true
    2. 对称性:对于任何引用xy,如果x.equals(y)返回true,那么y.equals(x)也应该返回true
    3. 传递性:对于任何引用xyz,如果x.equals(y)返回truey.equals(z)返回true,那么x.equals(z)也应该返回true
    4. 一致性:如果xy引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
    5. 对于任何非空引用xx.equals(null)应该返回false

 public boolean equals(Object obj) {
  boolean result = false;
  if (this == obj)
   return true;
  if (!(obj instanceof Student))
   return false;
  Student objTemp = (Student) obj;
  if (this.getId() == objTemp.getId())
   result = true;
  return result;
 }

Java语言中的hashcode:

  1. 将一个非0常数,例如17,储存于int result变量中。
  2. 对对象中的每一个有意义的字段f(更确切地说是被equals()所考虑的每一个字段)进行如下处理:
    A. 对这个字段计算出型别为int的hash 码 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),然后将计算结果按步骤2.A.iii处理。
      vi. 如果字段是个object reference,而且class 的equals()透过「递归呼叫equals()」的方式来比较这一字段,那么就同样也对该字段递归呼叫hashCode()。
      vii. 如果字段是个array,请将每个元素视为独立字段。也就是说对每一个有意义的元素施行上述规则,用以计算出hash 码,然后再依步骤2.B将这些数值组合起来。
    B. 将步骤A计算出来的hash码 c按下列公式组合到变量result中:result = 37*result + c;
 3. 传回result。
 4. 完成hashCode()之后,反躬自省一下:是否相等的实体具有相等的hash 码?如果不是,找出原因并修正问题。


只有注册用户登录后才能发表评论。


网站导航: