這些問題看似基礎,卻是區分「會寫代碼」與「理解 Java 運行機制」的分水嶺。若自以為已超越初學者卻無法精準回答,建議重新審視根基。本文詳細剖析前三大核心議題。
String s = "Hello world!";
許多人回答「宣告一個內容為 Hello world! 的 String」,這顯示概念模糊。正確理解:這行代碼宣告一個名為 s 的引用變量,型別為 String,目前指向字串常量池中的 "Hello world!" 物件。 並未建立新物件。若接著執行 String string = s;,只是建立另一個指向同一物件的引用,記憶體中仍只有一個 String 物件。
String a = new String("foo");
String b = new String("foo");
a == b; // false(兩個不同實例,地址不同)
a.equals(b); // true(內容相同)
警示:使用 equals() 或 HashMap/HashSet 等基於雜湊的集合時,務必確認該類的 equals() 邏輯符合預期,否則會導致難以除錯的行為差異。
String s = "Hello";
s = s + " world!";
String 設計為不可變類別。 上述代碼中,s 原本指向 "Hello",執行 + 操作後,s 指向新建立的 "Hello world!" 物件,原 "Hello" 物件仍存在於記憶體(只是無引用指向)。頻繁修改字串會產生海量臨時物件,造成記憶體壓力,此時應使用 StringBuffer 或 StringBuilder。
s = "Initial Value";,避免 new String("...") 建立多餘物件。理解這三大議題,即掌握了 Java 記憶體模型、物件語義與字串處理的核心邏輯,是進階開發的堅實基石。