在 Java 中,== 比較的是引用地址,而 equals() 用於比較對象的「邏輯內容」。Object 類預設的 equals() 實現等同於 ==,因此若需按業務屬性判斷相等,必須重寫該方法。
Cat c1 = new Cat(1, 1, 1);
Cat c2 = new Cat(1, 1, 1);
System.out.println(c1 == c2); // false,引用不同
System.out.println(c1.equals(c2)); // false,預設比較引用
雖然兩隻貓的屬性完全相同,但它們在堆內存中佔據不同空間,引用自然不同。
public class Cat {
int color, weight, height;
public Cat(int color, int weight, int height) {
this.color = color;
this.weight = weight;
this.height = height;
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof Cat) {
Cat c = (Cat) obj;
return c.color == this.color
&& c.weight == this.weight
&& c.height == this.height;
}
return false;
}
}
重寫後:c1.equals(c2) 返回 true。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true,String 重寫了 equals 比較字符序列
null。instanceof 確保類型兼容(或 getClass() 嚴格模式)。hashCode(),保證「相等對象哈希碼相等」,否則在 HashMap、HashSet 中會出錯。equals() 是實現對象邏輯相等的核心契約。每個類應根據業務語義決定比較哪些屬性,並遵循自反性、對稱性、傳遞性、一致性及非空性原則。