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

Java String 類完全指南:不可變字符串核心 API 與實戰技巧

     編輯:Java 相關知識

String 本質:不可變的字符序列

String 最終類,內部 final char[] value(JDK 9+ 改為 byte[] + coder),創建後內容不可變。所有「修改」操作實則返回新對象。常量池機制優化字面量複用。

創建方式差異

String s1 = "hello";              // 字面量 → 常量池,同值共享
String s2 = "hello";
String s3 = new String("hello");  // 堆新建對象,繞過常量池
String s4 = new String(new char[]{'h','e','l','l','o'});

s1 == s2;   // true  (同一池對象)
s1 == s3;   // false (堆 vs 池)
s1.equals(s3); // true (內容相同)

核心 API 分類速查

1. 查詢與判斷

方法說明範例
length()字符數(含中文)"Java語言".length() → 6
charAt(index)單字符"abc".charAt(1) → 'b'
indexOf(str/char [, from])首次出現位置,無則 -1"abab".indexOf('b') → 1
lastIndexOf(str/char [, from])末尾向前查找"abab".lastIndexOf('b') → 3
contains(s)是否包含 (JDK 5+)"abc".contains("b") → true
startsWith/endsWith(prefix)前綴/後綴匹配"test.jpg".endsWith(".jpg")
equals(obj)內容比較(區分大小寫)"Abc".equals("abc") → false
equalsIgnoreCase(str)忽略大小寫比較"Abc".equalsIgnoreCase("ABC")
compareTo(str)字典序比較(按字符編碼)"a".compareTo("b") → -1
compareToIgnoreCase(str)忽略大小寫字典序
matches(regex)正則全匹配"123".matches("\\d+") → true

2. 截取與分割


// substring [begin, end)
"Hello".substring(1)     → "ello"
"Hello".substring(1, 4)  → "ell"

// split 正則分割
"a,b,c".split(",")           → ["a","b","c"]
"a,,b".split(",")            → ["a","","b"]  中間空串保留
"a,b,".split(",")            → ["a","b"]     尾部空串默認丟棄
"a,b,".split(",", -1)        → ["a","b",""]  保留尾部空串
"a,b,c".split(",", 2)        → ["a","b,c"]   限制結果數

3. 替換與大小寫

"abcat".replace('a', '1')       → "1bc1t"       // 字符替換,全部
"abatbac".replaceAll("ba", "12")  → "a12t12c"   // 正則替換,全部
"abatbac".replaceFirst("ba", "12") → "a12tbac"  // 正則替換,首次

"AbC123".toLowerCase()  → "abc123"
"AbC123".toUpperCase()  → "ABC123"

4. 去空格與轉換

"  abc  ".trim()           → "abc"        // 兩端空格
"  abc  ".strip()          → "abc"        // JDK 11+ Unicode 感知
"  abc  ".stripLeading()   → "abc  "
"  abc  ".stripTrailing()  → "  abc"

"abc".toCharArray()        → ['a','b','c']
"計算機".getBytes()         → byte[] (平台默認編碼)
"計算機".getBytes("UTF-8")  → byte[] (指定編碼)
String.valueOf(123)        → "123"        // 任意類型 → String

5. 拼接(+ 操作符編譯器優化)

String s = "a" + "b" + "c";           // 編譯期常量折疊 → "abc"
String s2 = "a" + 1 + 2;              // "a12"  左到右,遇 String 則拼接
String s3 = 1 + 2 + "a";              // "3a"   先算數學再拼接

// 循環大量拼接 → StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) sb.append(i);
String result = sb.toString();

實戰技巧集錦

1. 獲取所有子串

String s = "abc";
for (int i = 0; i < s.length(); i++) {
    for (int j = i + 1; j <= s.length(); j++) {
        System.out.println(s.substring(i, j));
    }
}
// a, ab, abc, b, bc, c

2. 判斷數字位數

int n = 12345;
int digits = String.valueOf(n).length();  // 5

3. 字符串格式化

String.format("姓名:%s, 年齡:%d, 薪資:%.2f", "張三", 25, 8888.88);
// "姓名:張三, 年齡:25, 薪資:8888.88"

4. 高效判空

// 避免 NPE
if (str != null && !str.isEmpty()) { ... }
// JDK 11+
if (!str.isBlank()) { ... }  // 含空白字符判斷

性能與記憶體優化建議

  1. 常量池複用:優先用字面量 "text",避免 new String("text")。
  2. 大量拼接用 Builder:循環、未知次數拼接必須 StringBuilder(單線程)或 StringBuffer(多線程)。
  3. 避免重複創建:"a".equals(input) 比 input.equals("a") 更安全(防 NPE)。
  4. split 正則陷阱:"a|b".split("|") 需轉義 split("\\|"),否則按任意字符分割。
  5. 大字符串去重:JDK 8u20+ -XX:+UseStringDeduplication (G1 GC) 自動去重相同內容 char[]/byte[]。
  6. 序列化傳輸:網絡傳輸大文本考慮壓縮或分片,避免單個巨大 String 佔用老年代。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved