背景
Ojbect的equals方法代表的是引用是否引用的同一对象的相等性测试。
在以下情况下,Object的equals方法是不必覆写的:
ü 类的每个实例都是独一无二的。比如说线程,线程代表的是活动实体而不是值。此时Object的equals方法足以是满足该要求的。
ü 当用户并不关心逻辑是上的相等性的时候,可以不覆写equals方法。比如说一般情况下,当两个学生有相同的名字和学号时,我们都会认为是同一个人,但是有的人就认为这是两个不同的学生,那么就必要覆写equals方法。
ü 当父类的equals方法足够满足子类的比较时,就不需要覆写equals方法。比如Set的大部份实现类都继承调用了AbstractSet中的equals方法。
ü 如果类是私有的或者package-private的话,并且确认这些不会用来测试相等性的时候,就必须覆写equals方法,如下:
@Override public boolean equals(Object o) {
throw new AssertionError(); // Method is never called
}
何时覆写equals?
当两个对象有逻辑上的相等的时候。大部分都是针对类中的属性来进行相等性比较的。
Object的equals方法的特性
对于Object的equals方法的特性,请查看Java SE的文档,上面说的几条规则很清楚,必须遵守。
覆写equals的注意
1.覆写的equals方法是否满足:对称性、传递性、一致性。
2.覆写了equals方法的同时,一定要覆写hashCode()。
3.这样写public boolean equals(MyObject obj){}是错误的,这代表的是重载,而不是覆写。里面的参数类型不一样。所以必须这样public boolean equals(Object obj){}才正确。