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

Java String 類 10 大常見問題與最佳實踐總結

     編輯:Java 相關知識

Java 字串操作核心知識點深度解析

String 是 Java 中使用頻率最高的類別之一,但也最容易踩坑。本文整理 10 個高頻問題,附帶原理分析與最佳實踐,助你寫出更健壯的程式碼。

1. 字串比較:== vs equals()

  • == 比較的是記憶體位址(是否為同一物件)。
  • equals() 比較的是字串內容值。
  • 除非確定要比較物件身分,否則永遠使用 equals()。
  • 進階補充:理解 字串駐留 機制,"a" == "a" 為 true,但 new String("a") == "a" 為 false。

2. 敏感資料為何用 char[] 而非 String?

  • String 為不可變物件,一旦建立無法修改內容,密碼會長駐記憶體(甚至進入 String Pool),風險極高。
  • char[] 可明確清零(Arrays.fill(arr, '\0')),用完即銷毀,降低記憶體洩漏風險。

3. switch 支援 String 是從哪版本開始?

  • JDK 7+ 才支援 switch (str)。
  • JDK 6 及之前會編譯錯誤。
// 僅 JDK 7+ 有效
switch (str.toLowerCase()) {
    case "a": value = 1; break;
    case "b": value = 2; break;
}

4. 字串轉數字:大數值請用 Long

int age = Integer.parseInt("10");
long id = Long.parseLong("19000000000"); // 超過 int 範圍時必須用 Long

5. 依空白字元分割字串

  • split() 參數為正則表達式,\s 代表所有空白(空格、Tab、換行、換頁)。
  • Java 原始碼中需雙重轉義:"\\s+"。
String[] parts = aString.split("\\s+");

6. substring() 內部行為差異(JDK 6 vs 7+)

  • JDK 6:共用原 char[],透過 offset + count 形成「視圖」,可能導致大字串無法 GC。
  • JDK 7+:重新複製 char[],獨立物件,避免記憶體洩漏。
  • 若在 JDK 6 強制建立新物件:String sub = str.substring(start, end) + "";

7. String / StringBuilder / StringBuffer 選型

類別可變性執行緒安全效能適用場景
String不可變是(不可變天生安全)最低(頻繁修改產生大量物件)常量、少量拼接
StringBuilder可變否最高單執行緒大量拼接
StringBuffer可變是(synchronized)中等多執行緒共享緩衝區

8. 重複拼接同一字串的兩種方案

方案一:Apache Commons Lang 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();

9. 字串轉日期(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。

10. 統計字元出現次數

推薦使用 Apache Commons Lang:

int count = StringUtils.countMatches("11112222", "1"); // 4

若不想引入依賴,可用 String.replaceAll() 或迴圈計數。

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