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

Java String 比較全解析:== vs equals、null 安全寫法、字串常量池機制

     編輯:Java 程式設計入門

一、== vs equals() 核心差異

運算子比較內容典型結果
==參考位址(記憶體地址)同一物件才為 true
equals()字元序列內容內容相同即為 true

為何有時 == 也會是 true?

Java 編譯器將字串字面常量(如 "abc")放入字串常量池,相同內容只會有一份物件。因此:

String a = "hello";
String b = "hello";
System.out.println(a == b); // true(指向常量池同一物件)

何時 == 會失效?

String c = new String("hello"); // 強制在堆區建立新物件
String d = "hello";
System.out.println(c == d);     // false(不同物件)
System.out.println(c.equals(d)); // true(內容相同)

String e = "hel" + "lo";        // 編譯期常量折疊 → 常量池
String f = "hello";
System.out.println(e == f);     // true

String g = "hel";
String h = g + "lo";            // 運行期 new StringBuilder → 堆區新物件
System.out.println(h == f);     // false

二、str.equals("abc") vs "abc".equals(str)

寫法優點缺點建議
str.equals("abc")符合閱讀習慣需先判 str != null,否則拋 NPE需加非空檢查
"abc".equals(str)Null-safe,常量不為 null稍違直覺推薦

三、字串拼接與 null 陷阱

String a = null, b = null, c = "呵呵";
System.out.println(a + b + c); // 輸出:"nullnull呵呵"

原因:StringBuilder.append(null) 會附加字串 "null"。實務上請使用 Objects.toString(obj, "") 或 String.valueOf(obj) 避免「null」字樣混入業務資料。

四、最佳實踐總結

  1. 比較內容永遠用 equals()(或 Objects.equals())
  2. 常量放左邊:"expected".equals(actual)
  3. 拼接前統一處理 null:String val = (str == null) ? "" : str;
  4. 大量拼接用 StringBuilder,避免產生大量中間物件
  5. 理解常量池與 new String()、StringBuilder、+ 運算子的物件建立差異

五、補充:intern() 手動入池

String s = new String("hello").intern(); // 從常量池取得/放入同樣內容的參考
System.out.println(s == "hello"); // true

慎用:過度 intern() 會擴大常量池(永久代/Metaspace),影響 GC。

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