String 是 Java 中使用頻率最高的類別之一,但也最容易踩坑。本文整理 10 個高頻問題,附帶原理分析與最佳實踐,助你寫出更健壯的程式碼。
== vs equals()== 比較的是記憶體位址(是否為同一物件)。equals() 比較的是字串內容值。equals()。"a" == "a" 為 true,但 new String("a") == "a" 為 false。char[] 而非 String?String 為不可變物件,一旦建立無法修改內容,密碼會長駐記憶體(甚至進入 String Pool),風險極高。char[] 可明確清零(Arrays.fill(arr, '\0')),用完即銷毀,降低記憶體洩漏風險。switch 支援 String 是從哪版本開始?switch (str)。// 僅 JDK 7+ 有效
switch (str.toLowerCase()) {
case "a": value = 1; break;
case "b": value = 2; break;
}
Longint age = Integer.parseInt("10");
long id = Long.parseLong("19000000000"); // 超過 int 範圍時必須用 Long
split() 參數為正則表達式,\s 代表所有空白(空格、Tab、換行、換頁)。"\\s+"。String[] parts = aString.split("\\s+");
substring() 內部行為差異(JDK 6 vs 7+)char[],透過 offset + count 形成「視圖」,可能導致大字串無法 GC。char[],獨立物件,避免記憶體洩漏。String sub = str.substring(start, end) + "";| 類別 | 可變性 | 執行緒安全 | 效能 | 適用場景 |
|---|---|---|---|---|
| String | 不可變 | 是(不可變天生安全) | 最低(頻繁修改產生大量物件) | 常量、少量拼接 |
| StringBuilder | 可變 | 否 | 最高 | 單執行緒大量拼接 |
| StringBuffer | 可變 | 是(synchronized) | 中等 | 多執行緒共享緩衝區 |
StringUtils.repeat()String str = "abcd";
String repeated = StringUtils.repeat(str, 3); // "abcdabcdabcd"
StringBuilder 手動構建(更靈活)String src = "name";
int repeat = 5;
StringBuilder sb = new StringBuilder(src.length() * repeat);
for (int i = 0; i < repeat; i++) sb.append(src);
String result = sb.toString();
SimpleDateFormat)SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
String str = "2013-11-07";
Date date = fmt.parse(str);
System.out.println(fmt.format(date)); // 2013-11-07
注意: SimpleDateFormat 非執行緒安全,多執行緒環境請用 ThreadLocal 或 Java 8 DateTimeFormatter。
推薦使用 Apache Commons Lang:
int count = StringUtils.countMatches("11112222", "1"); // 4
若不想引入依賴,可用 String.replaceAll() 或迴圈計數。