Equals与Hashcode

1. 首先equals()是从object类中继承过来的。 equals()方法在object类中定义如下:

public boolean equals(Object obj) { 
   return (this == obj); 
}

很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们必需清楚,当String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法。
比如在String类中如下:

public boolean equals(Object anObject) { 
   if (this == anObject) { 
      return true; 
   } 
   if (anObject instanceof String) { 
      String anotherString = (String)anObject; 
      int n = count; 
      if (n == anotherString.count) { 
         char v1[] = value; 
         char v2[] = anotherString.value; 
         int i = offset; 
         int j = anotherString.offset; 
         while (n-- != 0) { 
            if (v1[i++] != v2[j++]) return false; 
         } 
         return true; 
      } 
   } 
   return false; 
}

或者看看下面这个重写的equals(Object obj)方法:

public class UserInfo {
  private String userName;
  private int userAge; 
  public UserInfo(String userName, int userAge) {
    super();
    this.userName = userName;
    this.userAge = userAge;
  }
  @Override
  public boolean equals(Object obj) {
    if(obj==this)   return true;
    UserInfo userinfo=(UserInfo)obj;
    if(userName.equals(userinfo.getUserName()) && userAge==userinfo.getUserAge())  return true;
    return false;
  }
}

很明显,这是进行的内容比较,而已经不再是地址的比较。依次类推Double、Integer、Math等等这些类都是重写了equals()方法的,从而进行的是内容的比较。当然了基本类型是进行值的比较,这个没有什么好说的。

我们还应该注意,Java语言对equals()的要求如下,这些要求是必须遵循的:

• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果,请大家一定要遵守。

3 weeks ago, this page was being read.

,

Subscribe to Comments