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

Java 核心:equals 與 == 操作符的深度比較與最佳實踐

     編輯:Java 程式設計入門

基本概念區別

equals 方法是 Object 類的一個方法,所有繼承自 Object 的類都會繼承此方法,並可重載實現各自比較操作,JDK 推薦這種做法。開發人員可在自己的類中實現 equals 完成特定比較功能,所以各類 equals 與 == 之間沒有絕對關係,需根據各類實現情況具體判斷。多數情況下區別在於:究竟是比較對象引用,還是比較對象值。

== 操作符比較什麼?

== 比較的是對象引用而非對象值。從 Object 源碼可見:

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

JDK 文檔說明 equals 實現等價關係:自反性、對稱性、傳遞性、一致性、非空性。對於 Object 類,equals 與 == 功能相同,皆比較引用。

String 類的 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 程式碼的基礎。

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