![]() |
|
||||||
Java中的equals Java中的所有对象都默认继承了Object的equals方法,在开发中,经常需要显式地覆盖(Override)这一方法,保证对象相等运算的正确性。
按照我的经验,在实践中还应该注意两点: 1) 不但要保证相等的对象确实“相等”,还应保证不相等的对象确实“不相等”:有可能出现的情况是,某个equals方法对除null外的所有参数均返回true,此时,该方法符合上面的四条特性,但它决不是一个逻辑正确的方法; 2) 在实现equals方法的同时,必须同时实现hashCode方法:hashCode方法也是从Object继承而来的,按照Java文档的建议,两个方法应该同时实现,并且保证equals为真的两个对象具有相同的hashCode值。 原因在于:如果仅仅调用Object的hachCode方法,JVM会根据对象在内存中的位置计算hashCode,有可能两个逻辑相等的对象会得到不同的散列值,而这是违背Hash的逻辑含义的。 补充一点: 如果需要用Collection来处理某种对象,最好是显式地实现hashCode方法。因为,如果向某个Collection(例如HashMap, HashSet)中添加多个对象,这些对象在内存中的位置可能非常靠近,因此都被散列到第一个桶(bucket)中,在这种情况下,访问Collection中元素的时间代价将由O(1)降低为O(n),对程序效率的影响极大。 如果没有找到好的hashCode算法,可以利用Apache Commons提供的HashCodeBuilder方便地实现hashCode。 |
|||||||
|
|||||||
| 热爱篮球...热爱摇滚... |
| JAVA:感受基于接口的Framwork的威力 < 上一篇 | 下一篇 > JAVA六种异常处理的陋习 |
用户回复
