我们通常是用“==”是比较的两个对象的内存地址,两个对象的内存地址是否相等,但是有些时候我们的比较是对两个对象的内容进行比较,所以使用object的equals方法就不可以了,实际上在JDK中,String和Math等类都对equals方法进行了重写,所以这些类中的比较就是对其内容的比较了。
使用equls的几个性质
1、自反性:对于任何的非空值x,x.equals(x)都是返回的true
2、对称性:非空引用x和y,x.equals(y)返回true有y.equals(x)返回true
3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
选择合适的比较方式
值得注意的是float和double的比较需要特定的方式
1) 对象域,使用equals方法 。
2) 类型安全的枚举,使用equals或== 。
3) 可能为null的对象域 : 使用 == 和 equals 。
4) 数组域 : 使用 Arrays.equals 。
5) 除float和double外的原始数据类型 : 使用 == 。
6) float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。
7) double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。
在equals()中使用getClass进行类型判断
package TwoWeek;
public class Equal {
public static void main(String args[]){
Student e2 = new Student("chenssy");
Person p1 = new Person("chenssy");
System.out.println(p1.equals(e2));
}
}
class Person{
private String name;
public Person(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean equals(Object object){
if(object.getClass() == Person.class){
// 上面如果使用if(object instanceof Person)结果就会是true了
Person p = (Person) object;
if(p.getName() == null || name == null){
return false;
}
else{
return name.equalsIgnoreCase(p.getName());
//将String与另一个String比较,不考虑大小写
}
}
return false;
}
}
class Student extends Person{
public Student(String name){
super(name);
}
}
强制类型转换