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"

詳細說明:Java String substring

搜尋字串

String s = "Hello World";
int index = s.indexOf("World");    // 6
int index2 = s.indexOf("Java");    // -1(找不到)
boolean has = s.contains("World"); // true

詳細說明:Java String indexOfJava 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