一 equals 方法
equals() 是超类Object 中的一个方法,用来比较两个对象是否相等。
二 equals 和 ==
在 java 中所有的对象都有标识(内存地址)和状态(数据),使用未重写的 equals() 方法进行对象的比较 和使用 “==” 进行比较都是在比较两个对象的内存地址是否相等,而不是它们的状态(数据)是否相等。
未重写的 equals 方法的源码:
public boolean equals(Object obj) {
return (this == obj);
}
如果我们想要实现对象之间数据的比较,那么我就应该要重写 equals 方法。在 JDK 中,String、Math 等都已经对 equals 进行了重写。所以我们在进行 String 的比较时,我们使用 equals 进行比较就是在对数据进行比较。
三 equals 的五大规则
- 自反性
任何非空引用值 x ,x.equals(x) 都返回 true - 对称性
对于任何非空引用值 x 和 y,当 x.equals(y) 等于 true 时,y.equals(x) 也必须等于 true - 传递性
对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true - 一致性
对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改 - 对于任何非空引用值 x,x.equals(null) 都应返回 false
四 不同的类型应该进行不同的比较方式
- 对象域,使用equals方法 。
- 类型安全的枚举,使用equals或== 。
- 可能为null的对象域 : 使用 == 和 equals 。
- 数组域 : 使用 Arrays.equals 。
- 除float和double外的原始数据类型 : 使用 == 。
- float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。
- double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。