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

Java 字符串比較:== 與 equals() 的核心差異與字符串常量池機制

     編輯:Java 相關知識

代碼示例與輸出

public class TestStringEquals {
    public static void main(String[] args) {
        String a = "test";
        String b = "test";
        String c = new String("test");
        String d = new String("test");
        String e = a;
        String f = new String(a);
        String g = a + "";

        System.out.println(a == b); // true
        System.out.println(a == c); // false
        System.out.println(c == d); // false
        System.out.println(a == e); // true
        System.out.println(a == f); // false
        System.out.println(a == g); // false

        if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
                && e.equals(f) && f.equals(g)) {
            System.out.println("所有 equals 比較均為 true");
        }
    }
}

深度解析

1. == 比較的是引用地址

  • a == b 為 true:字面量 "test" 編譯期進入字符串常量池,a 和 b 指向同一池對象。
  • new String("test") 每次在堆中創建新對象,故 c、d、f 地址各不相同。
  • a + "" 因字符串拼接運算符重載,內部會 new StringBuilder().append(...).toString(),產生新堆對象,故 g 地址不同。
  • e = a 直接賦值引用,故 a == e 為 true。

2. equals() 比較的是內容

String 重寫了 Object.equals(),逐字符比較值。因此所有變量 equals 比較均返回 true。

3. 字符串常量池機制

  • 字面量直接賦值(String s = "abc")會檢查常量池,存在則復用,不存在則創建並入池。
  • new String("abc") 強制在堆創建新對象,不入池(除非調用 intern())。
  • JDK 7 後常量池移至堆中,但語義不變。

最佳實踐建議

  • 比較字符串內容永遠使用 equals() 或 equalsIgnoreCase()。
  • 僅在確定比較引用同一性(如枚舉、單例、常量池對象)時使用 ==。
  • 避免在循環中頻繁 new String() 或拼接,優先用 StringBuilder。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved