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方法。先来看一下以下这段程序:
|
这是JDK中java.text.FieldPosition的标准实现,似乎没有什么可说的。 我信相大多数或绝大多数程序员认为,这是正确的合法的equals实现。
毕竟它是JDK的API实现啊。 还是让我们以事实来说话吧!
|
运行一下看看会打印出什么:
|
两个对象,出现了不对称的equals算法,问题出在哪里(脑筋急转弯:当然出在JDK实现的BUG)?我相信有太多的程序员(除了那些根本不知道实现equals方法的程序员外)在实现equals方法时都用过instanceof运行符来进行短路优化的,实事求是地说很长一段时间我也这么用过。
相关专题
- Java环境安装配置 (5786篇文章)
- Java编程开发手册 (8462篇文章)
- Java的类 (903篇文章)
- Java基础开发篇 (604篇文章)
- Java远程通讯可选技术及原理 (145次浏览)
- Java基础知识:初学者必须理解的六大问题 (76次浏览)
- 九个非常值得一看的MySpace程序 (72次浏览)
- Java初学者必须理解的六个大问题 (70次浏览)
- 微软企业级平台呼之欲出 英雄由“此”诞生 (66次浏览)
- Java基础知识:谈谈简单Hibernate入门 (58次浏览)
- struts验证框架开发详解 (48次浏览)
- Java入门-浅析Java学习从入门到精通 (47次浏览)
- 关于提高自己水平的十大技术 (47次浏览)
- Eclipse开发经典教程:SWT布局 (46次浏览)



