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

Java 字符串處理全攻略:String、StringBuilder、常用方法與性能優化

     編輯:Java 相關知識

String 本質

字符串本質是 char[],但 Java 中雙引號聲明的字符串都是 String 對象,體現「一切皆對象」。String 為 final 類,不可變:任何修改操作都會創建新對象。

String vs StringBuilder vs StringBuffer

特性StringStringBuilderStringBuffer
可變性不可變可變可變
線程安全是 (不可變天然安全)否是 (方法 synchronized)
性能拼接慢 (創建新對象)最快 (單線程推薦)稍慢 (同步開銷)
適用場景常量、少量拼接大量拼接、單線程多線程共享字符串緩衝區

性能實測:10,000 次拼接

class StringTest {
    public static void main(String[] args) {
        String constStr = "";
        long t = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) constStr += i;
        System.out.println("String: " + (System.currentTimeMillis() - t) + "ms"); // ~300ms

        StringBuilder sb = new StringBuilder();
        t = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) sb.append(i);
        System.out.println("StringBuilder: " + (System.currentTimeMillis() - t) + "ms"); // ~1ms
    }
}

結論:大量拼接必須用 StringBuilder (單線程) 或 StringBuffer (多線程)。

字符串常量池

JVM 維護一個字符串常量池。雙引號字面量或 intern() 會檢查池中是否存在相同字符串,存在則返回引用,否則創建並入池。

String s1 = "Hello";
String s2 = "Hello";           // 同一對象
String s3 = new String("Hello"); // 堆上新對象
System.out.println(s1 == s2);  // true
System.out.println(s1 == s3);  // false
System.out.println(s1.equals(s3)); // true

new String("Hello") 至少創建 2 個對象:池中 "Hello" + 堆上新對象。

核心方法速查

比較

  • equals(Object):內容比較(必須用此)。
  • equalsIgnoreCase(String):忽略大小寫。
  • compareTo(String):字典序比較 (實現 Comparable)。
  • ==:引用比較(勿用於內容比較)。

查找與提取

  • indexOf(str/char, fromIndex) / lastIndexOf:返回索引,-1 表未找到。
  • contains(CharSequence):是否包含子串。
  • startsWith/endsWith(prefix/suffix):前綴/後綴匹配。
  • substring(begin, end):提取子串 [begin, end)。JDK 7+ 會複製字符數組,不再共享。
  • charAt(index):單字符訪問。

分割與替換

  • split(regex, limit):正則分割。split("\\s+") 按空白字符分割。
  • replace(oldChar, newChar) / replace(CharSequence, CharSequence):字面量替換。
  • replaceAll/replaceFirst(regex, replacement):正則替換。

格式化與轉換

  • String.format(fmt, args) / String.format(locale, fmt, args):C 風格格式化。
  • valueOf(primitive/object):基本類型/對象轉字符串。
  • toCharArray() / getBytes(charset):轉字符/字節數組。
  • trim() / strip() (JDK 11+):去除首尾空白。

命令行參數

public static void main(String[] args) { // args[0] 為第一個參數,不含程序名
    for (String arg : args) System.out.println(arg);
}
// 執行: java MyClass Hello World
// 輸出: Hello / World

正則表達式應用

// 匹配 Email 簡易版
String emailRegex = "^[\\w.-]+@[\\w.-]+\\.\\w+$";
boolean valid = "test@example.com".matches(emailRegex); // true

// 使用 Pattern/Matcher 復用編譯
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123def456");
while (m.find()) System.out.println(m.group()); // 123, 456

最佳實踐總結

  1. 大量拼接用 StringBuilder (單線程) / StringBuffer (多線程)。
  2. 內容比較永遠用 equals()。
  3. 字面量優於 new String()(利用常量池)。
  4. 頻繁用作 Map key / Set 元素時,字符串不可變性保證哈希值穩定。
  5. 避免在循環中調用 substring 或 split 創建大量臨時對象,可預編譯 Pattern。
  6. JDK 11+ 使用 strip(), isBlank(), lines() 等新方法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved