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 (內容相同)
| 方法 | 說明 | 範例 |
|---|---|---|
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 |
// 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"] 限制結果數
"abcat".replace('a', '1') → "1bc1t" // 字符替換,全部
"abatbac".replaceAll("ba", "12") → "a12t12c" // 正則替換,全部
"abatbac".replaceFirst("ba", "12") → "a12tbac" // 正則替換,首次
"AbC123".toLowerCase() → "abc123"
"AbC123".toUpperCase() → "ABC123"
" 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
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();
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
int n = 12345;
int digits = String.valueOf(n).length(); // 5
String.format("姓名:%s, 年齡:%d, 薪資:%.2f", "張三", 25, 8888.88);
// "姓名:張三, 年齡:25, 薪資:8888.88"
// 避免 NPE
if (str != null && !str.isEmpty()) { ... }
// JDK 11+
if (!str.isBlank()) { ... } // 含空白字符判斷
"text",避免 new String("text")。StringBuilder(單線程)或 StringBuffer(多線程)。"a".equals(input) 比 input.equals("a") 更安全(防 NPE)。"a|b".split("|") 需轉義 split("\\|"),否則按任意字符分割。-XX:+UseStringDeduplication (G1 GC) 自動去重相同內容 char[]/byte[]。