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

Java 每日一題:字串常量池與 intern() 行為解析

     編輯:Java 綜合教學

題目代碼

String str1 = "編程";
String str2 = "編程";
String str3 = new String("編程");
String str4 = str3.intern();

System.out.print(str1 == str2); // true
System.out.print(str1 == str3); // false
System.out.print(str1 == str4); // true

執行結果

truefalsetrue

詳細解析

1. str1 == str2 → true

  • 雙引號字面量編譯期進入字串常量池
  • 相同字面量在常量池中唯一,str1、str2 指向同一對象

2. str1 == str3 → false

  • new String(...) 在堆內存創建新對象
  • str3 指向堆中對象,str1 指向常量池對象,地址不同

3. str1 == str4 → true

  • intern() 語義:若常量池已有相同內容字串,返回其引用;否則將此字串加入常量池並返回引用
  • str3.intern() 發現常量池已有 "編程"(str1/str2),直接返回常量池引用
  • 因此 str4 與 str1 指向同一常量池對象

記憶體結構圖示

String Constant Pool (常量池)
┌─────────────────────┐
│ "編程"  ← str1, str2, str4
└─────────────────────┘

Heap (堆)
┌─────────────────────┐
│ String Object "編程" ← str3
└─────────────────────┘

JDK 版本差異補充

  • JDK 6:常量池在永久代,intern() 會複製字串到永久代
  • JDK 7+:常量池移至堆中,intern() 只在常量池記錄引用,不複製字串內容,效能提升

面試延伸問題

  1. String s = new String("a") + new String("b"); s.intern() == s 結果?
    → JDK 7+ 為 true(常量池記錄 s 引用),JDK 6 為 false
  2. 何時使用 intern()?
    → 大量重複字串去重、節省記憶體;但濫用會導致常量池膨脹

核心記住:字面量進常量池,new 進堆,intern() 回常量池找/存引用。

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