為什么重寫(xiě)equals
先說(shuō)一說(shuō) == 比較
對(duì)于基本數(shù)據(jù)類型 == 比較的是數(shù)值
對(duì)于引用數(shù)據(jù)類型 == 比較的是地址
我們?cè)诔鯇W(xué)Java時(shí),String類我們會(huì)使用equals來(lái)比較兩個(gè)字符串的值是否相等
有些同學(xué)就會(huì)誤認(rèn)為equals比較的是引用類型的值。
但實(shí)際上,所有對(duì)象繼承自O(shè)bject類。默認(rèn)情況下,equals比較的仍然是地址。
我們來(lái)看一看Object中equals方法的源碼
public boolean equals(Object obj) {
return (this == obj);
}
this代表代用該方法的對(duì)象,obj表示要比較的對(duì)象。
我們發(fā)現(xiàn),equals方法又回到了兩者用等于號(hào)比較。
即引用數(shù)據(jù)類型 == 比較的是地址。
那為什么String類調(diào)用equals比較的是值呢?
因?yàn)镾tring類重寫(xiě)了equals方法
String類equals的源碼:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
首先還是用==號(hào)比較,如果地址相同。兩者當(dāng)然也相同。
然后下一步,將里面的值進(jìn)行了比較。
對(duì)于大部分Java原生對(duì)象,大多都重寫(xiě)了equals方法。
如果不確定,可以ctrl+鼠標(biāo)左鍵點(diǎn)擊進(jìn)行查看。
所以我們?cè)谧远x對(duì)象時(shí),如果不重寫(xiě)equals方法。
那么比較的將是兩個(gè)對(duì)象的地址,即使值相同。但兩者地址不同,仍然會(huì)判斷為不相等。