public class Person {
String name;
char sex;
int age;
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
}
我们先任意创建一个类
public class EqualsDemo {
public static void main(String[] args){
Person person1 = new Person("小明", '男', 20);
Person person2 = new Person("小明", '男', 20);
System.out.println(person1.equals(person2));
}
}
运行结果:
我们会发现结果是false,因位person1和person2是虽然内容相同,但是确实两个不同的对象,对象是引用类型,系统比较的是person1和person2的地址,不同的对象自然地址不同,因为打印结果为false,此时的equals作用和 == 作用相同
那怎么才能比较他们的内容
我们需要对系统提供的equals方法进行重写,然后根据自己的需求对比较内容进行填充
来看方法重写后的代码:
public class Person {
String name;
char sex;
int age;
public Person(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public boolean equals(Object obj) {
Person p = (Person) obj;// 向下转型
if (this.name.equals(p.name) && this.age == p.age && this.sex == p.sex) {
return true;
}
return false;
}
}
运行结果:
equals通过方法重写后被重新定了比较方式,此时比较的就是两个对象的内容,而不是他们的地址
注意:系统中的equals方法的参数是Object,重写方法必须与其保持一致,我们在比较是需要将变量obj向下转型,才能调用当前类中含有的成员变量即成员方法
这个代码是否可以优化呢?
显而易见是可以的
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (obj instanceof Person) {
Person p = (Person) obj;
if (this.name.equals(p.name) && this.age == p.age && this.sex == p.sex) {
return true;
}
}
return false;
}
可以先对对象是否为空和地址进行比较,上述都不满足时,对其进行类型判断