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

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

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;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航