equals(Object o)定义:比较是否相等,Object中的equals()方法与==相同(如下源码),都是比较两个对象的内存地址。子类一般情况下需要重写equals方法。
public boolean equals(Object obj) {
return (this == obj);
}
由此可见,原生的Object的equals()方法内部调用的是==,那么问题来了,既然是这样,为什么还费事定义equals方法呢?
equals()方法定义为:两个对象是否相等,判断对象是否相等的标准又是什么呢?
像上面的代码,在Object类中,标准即为==。这个标准是不固定的,其他类就可以对这个标注进行重新定义,例如我们经常接触的String就对它进行了重新的定义。如此体现了Java的灵活性和拓展性,如果没有进行重新定义默认为父类的equals方法直到指向Object类。
在实际情景下:可以根据不同的需求进行重新定义,如同为User对象,类型和userID相等即为同一个对象,如下代码重写了equals方法重新定义了标准:
package object;
public class User {
private int userId;
private String name;
private int age;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
protected String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof User)) {
return false;
}
if (((User) obj).getUserId() == this.getUserId()) {
return true;
}
return false;
}
}
测试类:
package object;
public class EqualsTest {
public static void main(String[] args) {
User u1 = new User();
u1.setUserId(1);
u1.setName("李四");
User u2 = new User();
u2.setUserId(1);
u2.setName("小四");
User u3 = new User();
u3.setUserId(2);
u3.setName("李四");
System.out.println(u1.equals(u2));
System.out.println(u1.equals(u3));
}
}
打印结果为:true和false,因为User重新定义了equals()方法,这个很好理解,小四是李四的小名他们是同一个人,而另一个名字虽然相同但是身份证号不同并不是一个人而仅仅是重名而已。