equals()与hashcode()都是Object类定义的方法,实际使用时可override,在覆盖时都须遵守各自的通用约定。
一. 覆盖equals()
1. 覆盖的时机
当某个类的超类未覆盖equals(),而该类又有自身的逻辑相等概念,就需覆盖。覆盖后的equals()用于判断对象在逻辑上是否相等,而非是否指向同一对象。
2. equals()的通用约定
自反性:对象必须等于其自身;
对称性:任何两个对象在“它们是否相等”这个问题上都应保持一致;
传递性:对象一等于对象二,对象二等于对象三,则对象一等于对象三;
一致性:如何两个对象相等,则它们必须始终相等,除非一个对象被改变;
非空性:所有对象都不应等于null。
3. 覆盖equals()时的一些注意事项
3.1 覆盖equals()时总要覆盖hashcode(),否则基于散列码的集合无法正常工作;
3.2 equals()方法仅仅用于判断逻辑上是否相等,如果功能过于复杂容易违反通用约定;
3.3 不要将equals()方法声明中的Object换成其他类,否则它是重载而非重写。
二. 覆盖hashcode()
1.1 在应用程序执行过程中,只要对象的equals方法的比较操作所得到的信息没有被修改,那么对同一对象的多次调用,hashcode()都返回同一值;
1.2 两个对象的equals()结果相等,则其hashcode()结果一定相等,反之不一定;
1.3 两个对象的equals()结果不相等,则其hashcode()结果不一定相等,但对于不同的对象产生不同的散列码将提高散列表的性能