首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 字符串創建機制深度解析:new String("xyz") 到底創建了幾個對象?

     編輯:程式設計疑難解答

經典面試題

String s = new String("xyz"); 這行代碼在 Java 中究竟創建了多少個 String 對象?這是一道極高頻的 Java 基礎面試題,考察對字符串常量池與堆內存分配機制的理解。

核心結論:視情況而定,可能是 1 個,也可能是 2 個

情況一:字符串常量池中已存在 "xyz"(創建 1 個對象)

  • 當執行 new String("xyz") 時,JVM 首先檢查字符串常量池(String Constant Pool)中是否已有內容為 "xyz" 的字符串對象。
  • 如果已存在:JVM 不會在常量池中重複創建,直接在堆內存中創建一個新的 String 對象,其內容指向常量池中的 "xyz"。此時 僅創建 1 個對象(堆上的新對象)。
  • 變量 s 引用指向堆上的這個新對象。

情況二:字符串常量池中不存在 "xyz"(創建 2 個對象)

  • 如果不存在:JVM 會先在字符串常量池中創建一個內容為 "xyz" 的 String 對象(第 1 個對象)。
  • 然後在堆內存中創建另一個新的 String 對象(第 2 個對象),內容同樣為 "xyz"。
  • 變量 s 引用指向堆上的這個新對象。

底層原理圖解

// 情況二示意圖(常量池無 "xyz" 時)
String Constant Pool (方法區/元空間)      Heap (堆內存)
+---------------------+                   +---------------------+
| "xyz"  <----------- |                   | new String("xyz")   |  <-- s 引用
+---------------------+                   +---------------------+
      對象 1                                對象 2

關鍵知識點總結

  1. 字面量 vs new:雙引號 "xyz" 是字面量,編譯期進入常量池;new String(...) 強制在運行期於堆中創建新對象。
  2. intern() 方法:調用 s.intern() 可手動將堆對象放入常量池(或返回常量池中已有對象的引用),實現去重。
  3. JDK 版本差異:JDK 7 之前常量池在永久代,JDK 7 及之後移至堆中,但邏輯不變。

最佳實踐建議

日常開發中 優先使用字面量 String s = "xyz";,避免不必要的 new String() 創建,減少堆內存壓力,利用常量池複用提升性能。

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