首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入理解 Java equals 方法與對象比較原理

     編輯:Java 相關知識

1. equals 方法基本介紹

在 Java 中,== 比較的是引用地址,而 equals() 用於比較對象的「邏輯內容」。Object 類預設的 equals() 實現等同於 ==,因此若需按業務屬性判斷相等,必須重寫該方法。

2. 為什麼預設 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,預設比較引用

雖然兩隻貓的屬性完全相同,但它們在堆內存中佔據不同空間,引用自然不同。

3. 正確重寫 equals 方法

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。

4. String 類的 equals 實現

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 比較字符序列

5. 重寫 equals 的最佳實踐

  1. 檢查 null。
  2. 使用 instanceof 確保類型兼容(或 getClass() 嚴格模式)。
  3. 轉型後逐一比較關鍵屬性。
  4. 同時重寫 hashCode(),保證「相等對象哈希碼相等」,否則在 HashMap、HashSet 中會出錯。

6. 總結

equals() 是實現對象邏輯相等的核心契約。每個類應根據業務語義決定比較哪些屬性,並遵循自反性、對稱性、傳遞性、一致性及非空性原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved