首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java equals() 比較:為什麼新建兩個物件回傳 false?

     編輯:程式設計疑難解答

現象重現

class V {}
public class T1 {
    public static void main(String[] args) {
        V v = new V();
        V v1 = new V();
        System.out.println(v.equals(v1)); // 輸出 false
    }
}

核心原因

Object 類別預設的 equals() 實作為 記憶體位址比較:

public boolean equals(Object obj) {
    return (this == obj);
}

v 與 v1 是兩個獨立實例,儲存位置不同,故回傳 false。

如何正確比較「內容相等」?

  1. 覆寫 equals() 與 hashCode()(必要配對)
  2. 比較業務關鍵欄位
class V {
    private int id;
    private String name;
    // getter/setter 省略

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        V v = (V) o;
        return id == v.id && Objects.equals(name, v.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

最佳實務清單

  • ✅ 覆寫 equals 時 必須 覆寫 hashCode
  • ✅ 使用 Objects.equals 避免空指標
  • ✅ 僅比較不可變或業務鍵欄位
  • ✅ 測試:new V(1,"A").equals(new V(1,"A")) == true

補充:== vs equals

運算子比較對象適用場景
==參考位址 / 基本型別值基本型別、Enum、同一物件實例檢查
equals()邏輯內容(需覆寫)DTO、Entity、Value Object、集合元素去重
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved