equals方法详解
书写equals方法采用instanceof还是getclass:
- 如果子类有自己的相等概念,则equals方法的对称性需求将强制采用getclass进行检测
- 如果由超类决定相等的概念,就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较
编写equals方法的建议:
- 显示参数命名为otherObject,稍后需要将它转换成other的变量
- 检测this与otherObject是否引用同一个对象:if(this==otherObject) return true;这实际上是一个优化。
- 检测otherObject是否为null,如果为null,返回false,这项检测是必要的。if(otherObject==null) return false;
- 比较this和otherObject是否属于同一个类。如果equals方法在子类中的语义有所改变,就用getClass检测:if(getClass()!=otherObject.getClass()) return false;如果所有子类的equals语义相同,用instanceof检测:if(!(otherObject instanceof ClassName)) return false;
- 将otherObject转换成相应的类类型变量: ClassName other = (ClassName) otherObject
- 下面开始对每一个域进行比较,基本类型用==比较,引用类型用equals方法比较,
- 如果子类重新定义equals方法,就要在其中调用super.equals(other),先要满足基本的父类相等,然后才去考虑子类的特殊部分
- 对于数组类型的域,可以采用静态的Array.equals方法检测相应的数组元素是否相等
Objects.equals(Object a,Object b) 如果a和b都为null,返回true,只有一个为null,返回false,否则返回a.equals(b)

浙公网安备 33010602011771号