Java 字串 (String)
字串是 Java 中最常使用的資料型別之一,用來儲存文字。在 Java 中,字串是物件,屬於 java.lang.String 類別。
建立字串
// 使用字串字面值(推薦)
String s1 = "Hello";
// 使用 new 關鍵字
String s2 = new String("Hello");
// 空字串
String empty = "";
建議使用字串字面值的方式,因為效率較高(會使用 String Pool)。
字串是不可變的
Java 的字串是不可變 (immutable) 的,一旦建立就不能修改:
String s = "Hello";
s.toUpperCase(); // 不會改變 s
System.out.println(s); // Hello
s = s.toUpperCase(); // 需要重新賦值
System.out.println(s); // HELLO
字串比較
使用 equals() 比較字串內容,不要用 ==:
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
// == 比較的是記憶體位址
System.out.println(s1 == s2); // true(String Pool)
System.out.println(s1 == s3); // false
// equals() 比較的是內容
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
// 忽略大小寫比較
System.out.println("Hello".equalsIgnoreCase("hello")); // true
更多詳細說明請參考 Java String equals。
常用字串方法
取得長度
String s = "Hello";
int len = s.length(); // 5
詳細說明:Java String length
取得字元
String s = "Hello";
char c = s.charAt(0); // 'H'
char c2 = s.charAt(4); // 'o'
詳細說明:Java String charAt
擷取子字串
String s = "Hello World";
String sub1 = s.substring(0, 5); // "Hello"
String sub2 = s.substring(6); // "World"
搜尋字串
String s = "Hello World";
int index = s.indexOf("World"); // 6
int index2 = s.indexOf("Java"); // -1(找不到)
boolean has = s.contains("World"); // true
詳細說明:Java String indexOf、Java String contains
取代字串
String s = "Hello World";
String newS = s.replace("World", "Java"); // "Hello Java"
詳細說明:Java String replace
分割字串
String s = "a,b,c,d";
String[] parts = s.split(","); // ["a", "b", "c", "d"]
詳細說明:Java String split
去除空白
String s = " Hello ";
String trimmed = s.trim(); // "Hello"
詳細說明:Java String trim
大小寫轉換
String s = "Hello";
String upper = s.toUpperCase(); // "HELLO"
String lower = s.toLowerCase(); // "hello"
詳細說明:Java String 大小寫轉換
格式化字串
String name = "Alice";
int age = 25;
String s = String.format("姓名:%s,年齡:%d", name, age);
// "姓名:Alice,年齡:25"
詳細說明:Java String format
字串方法一覽表
| 方法 | 說明 |
|---|---|
| length() | 取得字串長度 |
| charAt() | 取得指定位置的字元 |
| substring() | 擷取子字串 |
| indexOf() | 搜尋字元或子字串的位置 |
| lastIndexOf() | 從後面搜尋位置 |
| contains() | 檢查是否包含子字串 |
| equals() | 比較字串內容 |
| equalsIgnoreCase() | 忽略大小寫比較 |
| compareTo() | 比較字串大小 |
| replace() | 取代字元或子字串 |
| replaceAll() | 使用正規表達式取代 |
| split() | 分割字串 |
| trim() | 去除前後空白 |
| strip() | 去除前後空白(支援 Unicode) |
| toUpperCase() | 轉換成大寫 |
| toLowerCase() | 轉換成小寫 |
| startsWith() | 檢查是否以指定字串開頭 |
| endsWith() | 檢查是否以指定字串結尾 |
| isEmpty() | 檢查是否為空字串 |
| isBlank() | 檢查是否為空白字串 |
| format() | 格式化字串 |
| valueOf() | 將其他型別轉為字串 |
| join() | 連接多個字串 |
| concat() | 串接字串 |
| toCharArray() | 轉換為字元陣列 |
| getBytes() | 轉換為位元組陣列 |
| repeat() | 重複字串 |
| lines() | 按行分割 |
| indent() | 調整縮排 |
字串串接
多種方式可以串接字串:
String s1 = "Hello";
String s2 = "World";
// 使用 + 運算子
String result1 = s1 + " " + s2; // "Hello World"
// 使用 concat()
String result2 = s1.concat(" ").concat(s2); // "Hello World"
// 使用 String.join()
String result3 = String.join(" ", s1, s2); // "Hello World"
如果需要大量串接字串,建議使用 StringBuilder 以獲得更好的效能。
String Pool
Java 會將字串字面值存放在 String Pool 中,相同內容的字串會共用同一個物件:
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(同一個物件)
System.out.println(s1 == s3); // false(不同物件)
// 使用 intern() 將字串加入 String Pool
String s4 = s3.intern();
System.out.println(s1 == s4); // true