Java中關係操作符“==”和equals()方法的區別
阿新 • • 發佈:2019-03-29
一、前言
如果問你Java中==和equals()有何區別,相信你的第一反應會回答:==比較的是它們所指向的物件地址,而equals()方法比較的是它們的內容值。實際上,這樣的回答是不全面的。
二、關係操作符“==”
摘自《Java程式設計思想》一書中的原話:
關係操作符“==”生成的是一個boolean結果,它們計算的是運算元的值之間的關係。
那麼關於==的比較,無外乎以下兩種情況。
- 基本資料型別:它們的比較就是判斷值是否相同。
- 引用資料型別:它們的比較就是判斷是否是同一個物件的引用,即其引用變數所指向的物件的地址是否相同。
三、equals()方法
我們知道,Java中所有的類都是由Object類派生出來的,在Object類中定義定義了equals()方法,其原始碼如下:
public boolean equals(Object obj) {
return (this == obj);
}
也就是說,在沒有被重寫的情況下,比較的是引用型別的變數所指向的物件的地址
那麼,有哪些常用的類equals()方法被重寫了?比如String類、包裝類、Date類都是。
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; }
包裝類,比如Integer中equals()方法原始碼:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
這些被重寫的equals()方法的類,比較的是引用型別的變數所指向的物件儲存的內容是否相等,即比較