Java 關於 equals與操作符==的區別
阿新 • • 發佈:2019-01-11
在java語言中,經常容易引起大家疑惑的一個部分就是 equals 與 ==的區別,到底他們都有哪些區別呢?
我們首先來追本溯源,看看equals到底是從哪裡來的?它最原本的機制是什麼樣子的?
在java中所有物件的都有一個父類就是Object,既然針對每個物件都可以呼叫equals,那麼自然這個equals也是父類應該有的方法。
(實在不知道這個註釋怎麼貼上,湊合看吧)
public boolean equals(Object obj) {
return (this == obj);
}
大致意思就是,equals方法是用來被設計成非空物件之間用來判定是否是同一個物件的方法。任何物件的equals方法必須符合五個標準
- 自反性
- 對稱性
- 傳遞性
- 一致性
- 任何非空 x.equlas(null) 應該返回為false
需要特別注意的是如果要複寫equals方法的話,大部分都要複寫hashCode()用於保證相對的物件一定要hash值一致。
可以看到它的方法體,也是用到了==操作符,所以預設情況下,二者是相同的。
我們經常看到的不同,原因就是String這個類複寫了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;
}
同樣複寫了hashCode
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
如上我們在原始碼中看到的,在String這個類中,只要物件的值相等就可以認為是equals。
所以總體來說就是,如果兩個物件滿足==,那麼一定滿足equals,相反則不一定成立。
當然複寫equals方法的類很多 例如AbstractList,它則判斷list集合中的內容,以及順序是相同則認為是equals。Integer等。