在 Java 中,字符串是對象,由 java.lang.String 類表示(類名首字母大寫)。String 對象不可變,任何修改操作都會產生新對象。掌握字符串的創建機制、比較陷阱與常用 API,是寫好 Java 代碼的基礎。
// 方式一:字符串字面量(常量池)
String s1 = "Hello World";
// 方式二:new 關鍵字(堆內存)
String s2 = new String("Hello World");
// 方式三:空串
String s3 = new String();
關鍵差異:字面量會進入字符串常量池,相同內容只存一份;new 總在堆創建新對象,即使內容相同也佔用不同內存地址。
String a = "a";
String b = "a";
a += "b"; // a 變為 "ab"
System.out.println(a == "ab"); // false(地址不同)
System.out.println(a == b + "b"); // false
System.out.println(b == "a"); // true(常量池同一引用)
System.out.println(a.equals("ab")); // true(內容相等)
System.out.println(new String("ab") == new String("ab")); // false
== 比較引用地址(同時隱含內容比較)。equals() 比較字符序列內容。"a" + "b" 為 "ab",但運行期拼接不會。| 方法 | 說明 |
|---|---|
length() | 返回字符數 |
charAt(int index) | 返回指定索引字符 |
indexOf(int ch / String str [, fromIndex]) | 首次出現位置,找不到返回 -1 |
lastIndexOf(...) | 最後一次出現位置 |
getChars(srcBegin, srcEnd, dst[], dstBegin) | 複製字符到目標 char 數組 |
getBytes(...) | 按編碼獲取 byte 數組 |
toCharArray() | 轉為 char 數組 |
concat(String str):拼接replace(char old, char new):字符替換substring(int begin [, end]):截取子串toLowerCase() / toUpperCase():大小寫轉換trim():去除首尾空白split(String regex):正則分割StringBuilder(非線程安全)或 StringBuffer(線程安全)。+ 拼接,會產生大量臨時對象。CharSequence 或字符數組。字符串看似簡單,實則蘊含常量池、不可變模式、編碼轉換等核心機制,深入理解能有效避免生產環境的性能隱患與邏輯 Bug。