1.覆盖equals时请遵守通用约定
要覆盖equals就必须遵循以下约定
1 自反性
对于非空对象x x.equals(x)为true。(基本都满足)
2 对称性
对于非空对象x y. 若x.equals(y) 返回true,则y.equals(x) 一定返回true
3 传递性
对于非空对象x y z 。 若 x.equals(y), y.equals(z) 都返回true,则一定有x.equals(z) 返回true
4 一致性
对于不可变对象来说,如果两个对象相等,则永远相等。可变对象就不一定了。设计类是的时候就要考虑到它是否可变,不可变就必须遵循一致性。
5 非空性
对于非空对象x x.equals(null)都必须返回false
2.在覆盖equals时总要覆盖hashCode方法
对于覆盖hashcode也有约定:
1 在应用程序的执行期间,只要对象的equals方法的比较操作作用到的信息没有发生改变,那么对同一个对象多次调用,hashCode返回码必须是同一个整数。
2 如果两个对象根据equals方法比较相等,那么调用这两个对象任意一个对象的hashCode方法都必须产生同样的整数结果。
3 始终要覆盖toString ,toString覆盖起来没有太多的约定。
4 谨慎覆盖clone ,调用clone方法是不会调用构造器的。 其他的没理解清楚,不写了。
5 考虑实现Comparable接口,实现此接口可以在部分集合中完成排序的功能,compareTo也应该有 equals的传递性。