equals
Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,他们一定是相等的。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。
equals具有下面的特性:
- 自反性:对任何非空引用x,x.equals(x)应该返回true
- 对称性:对任何非空引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true
- 传递性
- 一致性:如果x和y引用的对象没有发生变化呢,反复调用应该返回相同的结果
- 对任意非空引用x,x.equals(null)应该返回false
编写equals的建议(放在下面的代码中)
1 | public class Employee { |
1 | public class Manager extends Employee { |
1 | public class EqualsTest { |
equals 和 ==的区别
对于 == 来说比较两个对象时,实质上是检查对象的内存地址是否相等
原生Objects.equals其实也是这么干的
为什么要重写hashCode()
原生hashCode方法到处的是对象存储地址。
由于定义equals与hashCode的定义必须一致:如果x.equals(y) 返回true,那么x.hashCode()必须等于y.hashCode()。所以当我们修改了equals方法后,应该也修改hashCode方法。