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

J2SE 核心技術深度解析:String 類特性、常用方法與效能陷阱全攻略

     編輯:Java 相關知識

java.lang.String 是 Java 最基礎也最常用的類別,但其不可變特性與記憶體模型常被誤解,導致效能問題。本文系統整理 String 核心特性、關鍵方法、字串連接效能陷阱、StringBuffer/StringBuilder 選擇指南,以及 split/replaceAll 正則表達式陷阱與對策。

String 核心特性:不可變與 final

  • final 類別:無法繼承擴充。
  • 不可變:建立後內容永不改變。substring()、concat()、replace() 等方法均回傳新 String 物件,原物件不變。
  • 兩種建立方式等效:
    String s1 = "test";          // 字面常量,可能進入字串常量池
    String s2 = new String("test"); // 強制在堆上建立新物件

常用方法速查表

方法說明
equals(Object)內容比較 (區分大小寫)
equalsIgnoreCase(String)內容比較 (忽略大小寫)
length()字元總數
trim()移除首尾空白字元 (空格、\t、\n、\r)
substring(int, int) / substring(int)擷取子字串 [start, end) / [start, 結尾)
charAt(int)取得指定索引字元
indexOf(String)尋找子字串首次出現位置,找不到回傳 -1
concat(String)字串連接,等同 + 運算子
startsWith/endsWith(String)前綴/後綴判斷

字串連接的效能陷阱與最佳實踐

String str = "I am " + "Lingo!"; 看似簡單,實際編譯後產生 三個 String 物件:兩個常量與一個連接結果。迴圈中連接字串會產生大量暫時物件,觸發頻繁 GC。

// 低效寫法
String result = "";
for (int i = 0; i < 10000; i++) result += "x"; // 產生 10000+ 個 String 物件

// 高效寫法:StringBuilder (單線程) / StringBuffer (多線程)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) sb.append("x");
String result = sb.toString(); // 僅 1 個 String 物件

// JVM 內部將 + 編譯為 StringBuilder.append (JDK 5+)

StringBuffer vs StringBuilder 選擇指南

特性StringBufferStringBuilder
線程安全同步方法,線程安全非同步,非線程安全
效能較低 (鎖開銷)較高 (無鎖)
適用場景多線程共享字串緩衝區單線程、區域變數、高效能需求

建議:除非確定需多線程共享,預設使用 StringBuilder。

StringBuffer 實用方法

  • reverse():反轉字串
  • append(...):尾端追加 (支援多型別)
  • insert(int, ...):指定位置插入
  • delete(int, int):刪除區間內容

split 與 replaceAll 正則表達式陷阱實戰

兩者參數皆為 正則表達式 (regex),特殊字元需轉義。

經典陷阱:分隔符號 "|" (管道符)

"1,3,4".split(",")     // 正確:["1", "3", "4"]
"1|3|4".split("|")     // 錯誤:["1", "|", "3", "|", "4"] - "|" 在 regex 代表 "或"
"1|3|4".split("\\|")   // 正確:["1", "3", "4"] - Java 字串需雙重轉義 \\ → \ → 字面 |

規則:regex 元字元 (| . * + ? ^ $ [ ] ( ) { } \) 作為字面字元時,需在 Java 字串中寫成 \\元字元。

replaceAll 同樣受影響

str.replaceAll("\\|", ",") // 將所有 | 替換為 ,

總結

  1. 理解 String 不可變本質,避免迴圈連接產生大量垃圾物件。
  2. 單線程字串構建優先選 StringBuilder;多線程共享用 StringBuffer。
  3. 使用 split/replaceAll 時務必掌握 regex 語法,特殊字元正確轉義 (\\)。
  4. 常用方法熟練掌握,特別是 substring 索引區間、trim 空白字元範圍。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved