String str = "abc";
String str1 = "ab";
String str2 = str1 + "c"; // 運行期拼接
String str3 = "a" + "b" + "c"; // 編譯期優化
System.out.println(str == str2); // false
System.out.println(str == str3); // true
System.out.println(str2 == str3); // false
"abc")存放在字符串常量池,同一字面量只有一份。"a" + "b" + "c" 全是常量,編譯器直接優化為 "abc",放入常量池,故 str == str3 為 true。str1 + "c" 中 str1 是變量,編譯器無法優化,運行時會創建新對象在堆內存,故 str == str2 為 false。equals() 判斷內容相等。
常量池: "abc" ← str, str3 指向這裡
堆內存: new String("abc") ← str2 指向這裡 (不同地址)
equals()** 或 Objects.equals()。StringBuilder/StringBuffer,避免產生大量臨時對象。intern() 方法:可將堆上字符串放入/獲取常量池引用。== 比較的是「是不是同一個對象」,equals() 比較的是「內容是不是一樣」。搞清常量池、編譯優化、運行期 new 對象三者關係,是 Java 面試與避坑必修課。