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

Java String 與 StringBuffer 常用方法速查與實戰陷阱避坑

     編輯:Java 相關知識

String 核心方法詳解

substring 子字串擷取

// 單參數:從 beginIndex 到結尾
"unhappy".substring(2)  // "happy"
"emptiness".substring(9) // ""

// 雙參數:[beginIndex, endIndex) 左閉右開
"hamburger".substring(4, 8) // "urge"
"smiles".substring(1, 5)    // "mile"

// 實戰:去除前導斜線
String resource = "/api/users";
String stripped = resource.startsWith("/") ? resource.substring(1) : resource; // "api/users"

⚠️ Java 7+ 共享 char[] 底層陣列,`substring` 為 O(1) 但會保留原大字串記憶體。大量處理長字串時建議 `new String(str.substring(...))` 強制複製。

其他高頻方法

方法說明範例
`charAt(int index)`取單一字元`"abc".charAt(1)` → `'b'`
`indexOf(String str)` / `lastIndexOf`搜尋位置,找不到回 -1`"ababa".indexOf("ba")` → `1`
`split(String regex)`正則分割`"a,b,c".split(",")` → `["a","b","c"]`
`replace(CharSequence, CharSequence)`字面替換 (非正則)`"a.b".replace(".", "_")` → `"a_b"`
`replaceAll(String regex, String repl)`正則替換`"a1b2".replaceAll("\\d", "#")` → `"a#b#"`
`trim()` / `strip()` (Java 11)去除首尾空白`" hi ".strip()` → `"hi"`
`startsWith` / `endsWith`前綴/後綴判斷`"img.png".endsWith(".png")` → `true`
`valueOf(Object)`萬能轉字串,null 安全`String.valueOf(null)` → `"null"`
`format(String fmt, Object... args)`格式化`String.format("%,d", 10000)` → `"10,000"`
`join(CharSequence, CharSequence...)` (Java 8)連接`String.join("-", "2024","01","01")` → `"2024-01-01"`

StringBuffer / StringBuilder 可變字串

核心差異:`StringBuffer` 同步安全 (舊 API);`StringBuilder` 非同步、效能更高 (Java 5+ 推薦)。

關鍵方法

StringBuilder sb = new StringBuilder(128); // 預估容量避免擴容
sb.append("user_").append(id).append("_").append(timestamp);
sb.insert(0, "prefix_");        // 指定位置插入
sb.delete(5, 10);               // 刪除區間
sb.replace(0, 3, "NEW");        // 替換區間
sb.reverse();                   // 反轉
String result = sb.toString();  // 最終轉 String

效能與選型指南

場景推薦原因
少量拼接、常數`+` / `String.concat()`編譯器優化為 `StringBuilder`
迴圈/大量拼接`StringBuilder`避免產生大量中間 String 物件
多執行緒共享緩衝區`StringBuffer`方法同步保證執行緒安全
日誌/除錯訊息Slf4j 佔位符 `log.debug("user={}", name)`避免字串拼接開銷,延遲計算

常見陷阱

  1. 不可變性誤解:`str.replace("a", "b")` 不修改原字串,必須接收回傳值
  2. `==` 比較內容:永遠用 `equals()` 或 `Objects.equals()`
  3. `split("|")` 正則陷阱:`|` 為特殊字元,需 `split("\\|")`
  4. 大字串 substring 記憶體洩漏:Java 7+ 仍共享陣列,長期持有大字串片段會阻礙 GC
  5. 頻繁 `+` 拼接在迴圈:每次迴圈隱建 `StringBuilder`,拉長 GC 壓力

Java 11+ 新增實用方法

  • `isBlank()`:空白字串判斷 (含空白字元)
  • `lines()`:依行分割成 `Stream`
  • `strip()` / `stripLeading()` / `stripTrailing()`:Unicode 感知去空白
  • `repeat(int count)`:重複字串 `"na".repeat(3)` → `"nananana"`
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved