equals 方法是 Object 類的一個方法,所有繼承自 Object 的類都會繼承此方法,並可重載實現各自比較操作,JDK 推薦這種做法。開發人員可在自己的類中實現 equals 完成特定比較功能,所以各類 equals 與 == 之間沒有絕對關係,需根據各類實現情況具體判斷。多數情況下區別在於:究竟是比較對象引用,還是比較對象值。
== 比較的是對象引用而非對象值。從 Object 源碼可見:
public boolean equals(Object obj) {
return (this == obj);
}
JDK 文檔說明 equals 實現等價關係:自反性、對稱性、傳遞性、一致性、非空性。對於 Object 類,equals 與 == 功能相同,皆比較引用。
String 重寫了 equals,比較的是字元序列是否相同:
public boolean equals(Object anObject) {
if (this == anObject) return true;
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++]) return false;
}
return true;
}
}
return false;
}
註釋說明:結果為 true 當且僅當參數非 null 且為代表相同字元序列的 String 對象。
equals 與 == 是否有區別要個別對待,根據 equals 具體實現判定equals 和 hashCode,保證語義一致性Integer、Long 等)與 String 皆重寫 equals 比較值List、Set)equals 比較元素內容而非引用理解這一核心機制,是寫出正確、健壯 Java 程式碼的基礎。