WEB开发网
开发学院WEB开发Jsp 对象相等比较:深入equals方法 阅读

对象相等比较:深入equals方法

 2008-01-05 20:29:50 来源:WEB开发网   
核心提示:equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现equals方法,让对象用你认为相等的条件来进行比较.下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为这些规范在事实中并不是真正能保证得到实现.1.对于任何引用类型, o.equals(o) == t

equals方法的重要性毋须多言,只要你想比较的两个对象不愿是同一对象,你就应该实现
equals方法,让对象用你认为相等的条件来进行比较.

下面的内容只是API的规范,没有什么太高深的意义,但我之所以最先把它列在这儿,是因为
这些规范在事实中并不是真正能保证得到实现.

1.对于任何引用类型, o.equals(o) == true成立.
2.假如 o.equals(o1) == true 成立,那么o1.equals(o)==true也一定要成立.
3.假如 o.equals(o1) == true 成立且  o.equals(o2) == true 成立,那么
  o1.equals(o2) == true 也成立.
4.假如第一次调用o.equals(o1) == true成立再o和o1没有改变的情况下以后的任何次调用
都成立.
5.o.equals(null) == true 任何时间都不成立.

以上几条规则并不是最完整的表述,具体的请参见API文档.

对于Object类,它提供了一个最最严密的实现,那就是只有是同一对象是,equals方法才返回
true,也就是人们常说的引用比较而不是值比较.这个实现严密得已经没有什么实际的意义,
所以在具体子类(相对于Object来说)中,假如我们要进行对象的值比较,就必须实现自己的
equals方法.

先来看一下以下这段程序:


   public boolean equals(Object obj)
   {
     if (obj == null) return false;
     if (!(obj instanceof FieldPosition))
       return false;
     FieldPosition other = (FieldPosition) obj;
     if (attribute == null) {
       if (other.attribute != null) {
         return false;
       }
     }
     else if (!attribute.equals(other.attribute)) {
       return false;
     }
     return (beginIndex == other.beginIndex
       && endIndex == other.endIndex
       && field == other.field);
   }

 这是JDK中java.text.FieldPosition的标准实现,似乎没有什么可说的.

 我信相大多数或绝大多数程序员认为,这是正确的合法的equals实现.究竟它是JDK的API实现啊.

 还是让我们以事实来说话吧:

package debug;

import java.text.*;

public class Test {
  public static void main(String[] args) {
   FieldPosition fp = new FieldPosition(10);
   FieldPosition fp1 = new MyTest(10);
   System.out.PRintln(fp.equals(fp1));
   System.out.println(fp1.equals(fp));
  }
}
class MyTest extends FieldPosition{
  int x = 10;
  public MyTest(int x){
   super(x);
   this.x = x;
  }
  public boolean equals(Object o){
   if(o==null) return false;
   if(!(o instanceof MyTest )) return false;
   return ((MyTest)o).x == this.x;

Tags:对象 相等 比较

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接