什么时候该覆盖equals?
简单来说,需要对象比较逻辑相等(不是对象相等的意思) ,并且超类没有满足条件。比如:Integer或者Date。
覆盖equals通用约定
以下x不考虑为null情况
- 自反性 x.equals(x) == true
- 对称性 因为 x.equals(y) == true ,所以 y.equals(x) == true
- 传递性 因为 x.equals(y) == true, y.equals(z) ==true 所以 x.equals(z) == true。
- 一致性 只要x.equals()方法用到变量信息没有改变, x.equals(y) 结果总会一致
- 非空性 因为y == null 所以 x.equals(z) == false
作者的建议
- 覆盖equals时必须覆盖hashCode
- 不要企图让equals方法过于智能 单纯判断域中的值,而不是各种等价关系 。例如File类不应该试图把指向同一个文件的链接当作相等的对象来看,当然File类也没有这么做。
- 不要将equals声明中的Object对象替换为其他的类型
网友评论