會用equals其實沒什么用昭娩,它的臉上寫著:請重寫我,謝謝叉趣。
本文基于Mars老師的Java4Android視頻暮胧。
equals函數(shù)
我們知道锐借,“==” 是用來比較兩個值是否相等问麸,這在基本數(shù)據(jù)類型中沒有什么異議往衷,而在引用數(shù)據(jù)類型(也就是對象)中,“==”判斷兩個引用是否指向堆內(nèi)存中的同一塊地址严卖。
equals是用來比較兩個對象的內(nèi)容是否相等席舍。內(nèi)容相等是指:對象的類型相同(可用instanceof操作符比較);對象的成員變量的值完全相同哮笆。
equals函數(shù)在Object類中来颤。Object類又是所有類的父類,因此所有類都有equals方法稠肘。問題是福铅,Object類中有equals方法,是想讓用到equals方法的子類项阴,都去重寫它滑黔。因為Object只是隨便寫了寫equals,代碼如下:
public boolean equals(Object obj) {
returns(this == obj);
}
是不是和“==”毫無區(qū)別环揽?因此我們需要重寫它略荡。重寫的原則,就是上面提到的內(nèi)容相等:對象的類型相同歉胶、對象的成員變量的值相同汛兜。
舉個栗子:
class User {
String name;
int age;
public boolean equals(Object obj) {
if(this == obj)
return true;
boolean b = obj instanceof User;
if(b) {
//向下轉(zhuǎn)型
//這里沒有先向上轉(zhuǎn)型,是因為先用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));
}
}
運行結(jié)果: