String s = new String("xyz"); 這行代碼在 Java 中究竟創建了多少個 String 對象?這是一道極高頻的 Java 基礎面試題,考察對字符串常量池與堆內存分配機制的理解。
new String("xyz") 時,JVM 首先檢查字符串常量池(String Constant Pool)中是否已有內容為 "xyz" 的字符串對象。String 對象,其內容指向常量池中的 "xyz"。此時 僅創建 1 個對象(堆上的新對象)。s 引用指向堆上的這個新對象。String 對象(第 1 個對象)。String 對象(第 2 個對象),內容同樣為 "xyz"。s 引用指向堆上的這個新對象。// 情況二示意圖(常量池無 "xyz" 時)
String Constant Pool (方法區/元空間) Heap (堆內存)
+---------------------+ +---------------------+
| "xyz" <----------- | | new String("xyz") | <-- s 引用
+---------------------+ +---------------------+
對象 1 對象 2
"xyz" 是字面量,編譯期進入常量池;new String(...) 強制在運行期於堆中創建新對象。s.intern() 可手動將堆對象放入常量池(或返回常量池中已有對象的引用),實現去重。日常開發中 優先使用字面量 String s = "xyz";,避免不必要的 new String() 創建,減少堆內存壓力,利用常量池複用提升性能。