Java语言规范对equals方法的要求有如下:
- 自反性——x.equals(x)为真
- 对称性——x.equals(y)与y.equals(x)返回结果相同
- 传递性——x.equals(y)且y.equals(z)则x.equals(z)
- 一致性——x.equals(y)结果要一直一样
- 对于任意的非空引用值x,x.equals(null)必须返回假。
编写一个完美的equals方法的步骤:(需要注意的是,传入的参数类型应该是Object类型,而不是相应的类类型,否则无法覆盖Object中的equals方法)
- 判断是否为相同的引用
- 判断传入的object是否为null
- 比较是否为同一个类,使用getClass或者instanceOf(当所有子类的语义一致时)
- 将传入的object转换为对应的类类型
- 进行相应的变量域比较
一般地,覆盖equals方法也需要覆盖hashCode方法,主要是为了一些集合类中的正常使用