== 比較引用位址;equals() 預設同 ==,但旨在由子類別覆寫實現「值相等」語意。兩者關係取決於具體類別的實作。
public boolean equals(Object obj) {
return (this == obj); // 預設僅比較引用
}
JDK 文檔規範 equals() 必須滿足:自反性、對稱性、傳遞性、一致性、非空性。覆寫 equals() 必須同步覆寫 hashCode(),否則破壞雜湊容器契約。
public boolean equals(Object anObject) {
if (this == anObject) return true; // 快速路徑
if (anObject instanceof String) {
String another = (String) anObject;
if (count != another.count) return false; // 長度不同直接 false
char[] v1 = value, v2 = another.value;
int i = offset, j = another.offset;
while (count-- != 0) if (v1[i++] != v2[j++]) return false; // 逐字元比較
return true;
}
return false;
}
文檔註解明確:「僅當參數非 null 且為 String,且字元序列完全相同時回傳 true。」
| 類別 | equals() 行為 | 建議 |
|---|---|---|
| Object / 未覆寫類別 | 引用比較(同 ==) | 不可用於業務邏輯判等 |
| String, 包裝類, 集合, 多數值物件 | 值比較 | 放心使用 |
| 自訂類別 | 視覆寫情況而定 | 必須依業務鍵覆寫 equals/hashCode |