会用equals其实没什么用,它的脸上写着:请重写我,谢谢。
本文基于Mars老师的Java4Android视频。
equals函数
我们知道,“==” 是用来比较两个值是否相等,这在基本数据类型中没有什么异议,而在引用数据类型(也就是对象)中,“==”判断两个引用是否指向堆内存中的同一块地址。
equals是用来比较两个对象的内容是否相等。内容相等是指:对象的类型相同(可用instanceof操作符比较);对象的成员变量的值完全相同。
equals函数在Object类中。Object类又是所有类的父类,因此所有类都有equals方法。问题是,Object类中有equals方法,是想让用到equals方法的子类,都去重写它。因为Object只是随便写了写equals,代码如下:
public boolean equals(Object obj) {
returns(this == obj);
}
是不是和“==”毫无区别?因此我们需要重写它。重写的原则,就是上面提到的内容相等:对象的类型相同、对象的成员变量的值相同。
举个栗子:
class User {
String name;
int age;
public boolean equals(Object obj) {
if(this == obj)
return true;
boolean b = obj instanceof User;
if(b) {
//向下转型
//这里没有先向上转型,是因为先用instanceof判断过了
User u = (User)obj;
if(this.age == u.age && this.name.equals(u.name))
return true;
else
return false;
} else {
return false;
}
}
}
public class Test {
public static void main(String args []) {
User u1 = new User();
User u2 = new User();
User u3 = new User();
u1.name = "Ada";
u1.age = 16;
u2.name = "Ben";
u2.age = 16;
u3.name = "Ada";
u3.age = 16;
System.out.println(u1.equals(u2));
System.out.println(u1.equals(u3));
}
}
运行结果: