Java 使用字串池管理字面常量。首次使用字面值時放入池中,後續相同字面值直接引用池中物件,不被 GC 回收。使用 new String() 則在堆上建立新物件,不指向池中,可用 intern() 手動放入池中。
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
String s = new String("abc"); → 2 個(池中 "abc" + 堆上新物件)String s = "ab" + "cd"; → 1 個(編譯期常量折疊為 "abcd" 進池)str1 + str2 → 產生新物件不進池,除非皆為 final static 常量且編譯期可解析。final static String STR1 = "ab";
final static String STR2 = "cd";
String s3 = "ab" + "cd"; // 池中 "abcd"
String s4 = STR1 + STR2; // 編譯期常量折疊,指向池中 "abcd" → true
String s5 = STR1 + "cd"; // 同上 → true
// 若非即時賦值(如在 static 區塊賦值),則視為變數,拼接結果不進池 → false
| 分類 | 代表方法 |
|---|---|
| 獲取 | length(), charAt(), indexOf(), lastIndexOf() |
| 判斷 | contains(), startsWith(), endsWith(), isEmpty(), equals(), equalsIgnoreCase() |
| 轉換 | toCharArray(), getBytes(), valueOf(), copyValueOf(), String(char[]) |
| 修改 | replace(), split(), substring(), toUpperCase(), toLowerCase(), trim() |
| 比較 | compareTo()(自然順序) |
public static void reverse(String str) {
for (int i = str.length(); i > 0; i--) {
System.out.print(str.charAt(i - 1));
}
}
public static String maxCommonSubstring(String s1, String s2) {
String result = null;
outer:
for (int len = s1.length(); len > 0; len--) {
for (int i = 0; i <= s1.length() - len; i++) {
String sub = s1.substring(i, i + len);
if (s2.contains(sub)) {
result = sub;
break outer;
}
}
}
return result;
}
此演示採用遞減長度遍歷,效率較低;實務上可用後綴樹或動態規劃優化。