equals()的概述
equals()可以用来判断两个对象是否相等
于是开始翻看Object类中的equals()的源码发现如果不重写的话,被子类继承下去,就是比较两个对象的地址是否相等,即是否是同一个对象。
public boolean equals(Object obj) {
// 判断两个对象的地址是否相等
return (this == obj);
}
重写此方法需要注意其五大特性:
自反性 :对于任何非空的参考值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 。
package test;
import java.util.Objects;
public class demo01 {
public static void main(String[] args) {
Person p1 = new Person("张三", 18);
Person p2 = new Person("张三", 18);
System.out.println("p1.equals(p2): " + p1.equals(p2));
System.out.println("p1==p2: " + (p1==p2));
}
private static class Person extends Object{
private int age;
private String name;
public Person() {
}
public Person(String name, int age) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
// 如果是同一个对象则会返回true
if (this == o) return true;
// 如果传入的参数是空 或 类型不同则返回false
// getClass()返回Class类型的对象,
// 这里是class test.demo01$Person
if (o == null || getClass() != o.getClass()) return false;
// 由于是同一个类型我们可以进行强转
Person person = (Person) o;
// 最后比较两个属性的内容是否相等
return age == person.age &&
Objects.equals(name, person.name);
}
}
}
运行结果:
p1.equals(p2): true
p1==p2: false