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

equals() 與 == 運算子深度解析:從 Object 到 String 的演進邏輯

     編輯:Java 程式設計入門

核心結論先行

== 比較引用位址;equals() 預設同 ==,但旨在由子類別覆寫實現「值相等」語意。兩者關係取決於具體類別的實作。

Object 基礎實作

public boolean equals(Object obj) {
    return (this == obj); // 預設僅比較引用
}

JDK 文檔規範 equals() 必須滿足:自反性、對稱性、傳遞性、一致性、非空性。覆寫 equals() 必須同步覆寫 hashCode(),否則破壞雜湊容器契約。

String 覆寫實現值比較

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。」

實務判斷矩陣

常見陷阱

  1. String s1 = "abc"; String s2 = new String("abc"); s1 == s2 → false(不同物件)
  2. Integer a = 127; Integer b = 127; a == b → true(-128~127 快取),128 → false
  3. 集合含有可變物件作為元素/鍵時,修改內容導致 equals() 與 hashCode() 不一致,破壞容器結構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
類別equals() 行為建議
Object / 未覆寫類別引用比較(同 ==)不可用於業務邏輯判等
String, 包裝類, 集合, 多數值物件值比較放心使用
自訂類別視覆寫情況而定必須依業務鍵覆寫 equals/hashCode