續接上篇,本文涵蓋字串拼接效能選擇、複雜字串操作用正則、統一 UTF-8 編碼、中文排序邊界處理四大實戰建議。
測試 10 萬次迴圈拼接單字元:
| 方式 | 耗時 | 原理 |
|---|---|---|
StringBuilder.append() | ~1 ms | 單一陣列擴容,無中間物件 |
StringBuffer.append() | ~2 ms | 同步鎖開銷 |
String.concat() | ~150 ms | 每次建立新 char[] 與 String 物件 |
+ 操作符 | ~500 ms | 每次隱建 StringBuilder 並 toString() |
結論:
StringBuilderStringBuffer+ 可讀性最佳,編譯器優化足夠+ 與 concat()需求:統計文章英文單字數。split(" ") 失敗於連續空格、標點、連字符。
正則 \\b\\w+\\b(單字邊界 + 單字字元)精準匹配:
Pattern p = Pattern.compile("\\b\\w+\\b");
Matcher m = p.matcher(text);
int count = 0;
while (m.find()) count++;
注意:正則威力大但可讀性差,複雜正則務必加註解或提取為常數。
亂碼根因:編碼不一致。Java 內部用 UTF-16,.class 檔為 UTF-8,但原始碼檔、資料庫、網路傳輸、作業系統預設編碼可能不同(GBK、Big5、ISO-8859-1)。
最佳實踐:
javac -encoding UTF-8 或 Maven <encoding>UTF-8</encoding>。characterEncoding=utf8,表建立 CHARSET=utf8mb4。Content-Type: application/json; charset=UTF-8。new String(bytes, StandardCharsets.UTF_8),避免依賴平台預設值。String.compareTo() 按 Unicode 碼點比較,「張」(U+5F20) < 「李」(U+674E),不符拼音順序。
使用 Collator.getInstance(Locale.CHINA) 依語言規則排序:
String[] names = {"張三", "李四", "王五"};
Arrays.sort(names, Collator.getInstance(Locale.CHINA));
// 結果:李四、王五、張三
限制:罕見字、多音字、造字(如「犇」「鑫」「淼」)可能仍排序錯誤,因 Unicode 排序非拼音順序。嚴格需求可用 pinyin4j 轉拼音後自訂比較器,但需處理同音字、多音字複雜度。
建議:非關鍵業務用 Collator 即可;關鍵業務投入專用拼音排序庫。