1. 方法 length():字串中有多少個字元?
方法 length() 會回傳字串中的字元數。這與「位元組數」不完全相同(尤其當字串包含表情符號或 Unicode 字元時),但對多數情況而言——這正是你需要的。
使用範例
String name = "Vasilisa";
int length = name.length();
System.out.println("名字中的字母數量:" + length); // 8
為什麼需要它
- 檢查使用者是否輸入了空字串。
- 檢查密碼的最小/最大長度。
- 計算距離上限還剩多少字元(例如 SMS 或推文)。
範例:檢查是否為空字串
String input = "";
if (input.length() == 0)
{
System.out.println("字串為空!");
}
小技巧:要檢查字串是否為「空」,也可以用 isEmpty(),稍後會再提。
簡短 FAQ
- 方法 length() 不接受任何引數(括號永遠是空的)。
- 如果字串只包含空白,這些空白也算作字元!
- 如果字串為 null,呼叫 length() 會導致 NullPointerException —— 請先檢查是否為 null。
2. 方法 substring():擷取字串的一部分
方法 substring() 可以依指定索引取得子字串——也就是把一段「切」下來。
主要有兩種呼叫方式:
- str.substring(startIndex) —— 從位置 startIndex 一直到字串結尾。
- str.substring(startIndex, endIndex) —— 從位置 startIndex 到 endIndex(不包含索引為 endIndex 的字元)。
注意:字串的索引從 0 開始。
使用範例
範例 1:取得名字的前三個字母
String name = "Vasilisa";
String firstThree = name.substring(0, 3); // "Vas"
System.out.println(firstThree);
範例 2:取得檔案副檔名
String fileName = "document.pdf";
int dotIndex = fileName.indexOf(".");
String extension = fileName.substring(dotIndex + 1); // "pdf"
System.out.println(extension);
範例 3:取得字串最後 4 個字元
String cardNumber = "1234567890123456";
String lastFour = cardNumber.substring(cardNumber.length() - 4); // "3456"
System.out.println("最後 4 位數字:" + lastFour);
重點與細節
- 不正確的索引(startIndex < 0、endIndex > 長度、startIndex > endIndex)會拋出 StringIndexOutOfBoundsException。
- 此方法永遠回傳新字串——原始字串不會改變。
- 雙參數版本不包含索引為 endIndex 的字元。
String str = "abcdef";
// 索引: 0 1 2 3 4 5
str.substring(1, 4) → "bcd" // 索引為 1、2、3 的字元
substring(start, end) 的工作示意
3. 方法 indexOf():搜尋字元或子字串
方法 indexOf() 會尋找指定字元或子字串第一次出現的位置(索引)。
- 若找到——回傳索引(從 0 開始)。
- 若找不到——回傳 -1。
使用範例
範例 1:找出 email 中第一個點
String email = "ivan.petrov@mail.com";
int dotIndex = email.indexOf('.');
System.out.println("第一個點在位置:" + dotIndex); // 4
範例 2:尋找子字串
String text = "I love Java!";
int index = text.indexOf("Java");
System.out.println(index); // 7
範例 3:從特定位置之後再找字元
String s = "abracadabra";
int firstA = s.indexOf('a'); // 0
int secondA = s.indexOf('a', firstA + 1); // 3
System.out.println("第二個 'a' 在位置:" + secondA);
重點與細節
- 若字元/子字串出現多次,會回傳第一次出現的位置。
- 要找最後一次出現,請使用 lastIndexOf()。
- 單一字元用單引號:'a';子字串用雙引號:"abc"。
範例:尋找檔案副檔名
String fileName = "report.final.version.docx";
int lastDot = fileName.lastIndexOf('.');
String extension = fileName.substring(lastDot + 1);
System.out.println("檔案副檔名:" + extension); // "docx"
4. 方法 charAt():依索引取得字元
方法 charAt(index) 會依索引回傳字串中的字元。
使用範例
範例 1:檢查字串的第一個字母
String city = "Minsk";
char first = city.charAt(0); // 'M'
System.out.println("第一個字母:" + first);
範例 2:檢查是否以大寫字母開頭
String word = "Java";
if (Character.isUpperCase(word.charAt(0)))
{
System.out.println("這個單字是以大寫字母開頭!");
}
範例 3:逐一走訪字串的所有字元
String text = "Privet";
for (int i = 0; i < text.length(); i++)
{
System.out.println("字元 #" + i + ": " + text.charAt(i));
}
重點與細節
- 索引超出範圍(例如 -1 或 >= 長度)會導致 StringIndexOutOfBoundsException。
- 此方法回傳型別為 char,而不是字串。
5. 方法 toCharArray():將字串轉為字元陣列
方法 toCharArray() —— 將字串轉為字元陣列(char[])的簡單方式。用於逐字元處理、排序、檢查等很方便。
使用範例:
String text = "Hello";
char[] characters = text.toCharArray();
for (char c : characters)
{
System.out.println(c);
}
// 輸出:
// H
// e
// l
// l
// o
為什麼需要它:
- 字元處理: 陣列對逐字元邏輯更方便(例如檢查是否為變位詞)。
- 相容性: 有些 API 需要 char[] 當作引數。
6. 方法 replace():取代子字串
方法 replace(CharSequence target, CharSequence replacement) 會把所有出現的子字串 target 取代為 replacement。會回傳新字串,原始字串不會改變。
使用範例:
String sentence = "I love programming in Java.";
String newSentence = sentence.replace("Java", "Java 25");
System.out.println(newSentence);
// 輸出:I love programming in Java 25.
String email = "support@company.com";
String cleanEmail = email.replace("@", "[at]");
System.out.println(cleanEmail);
// 輸出:support[at]company.com
重點與細節
- 會取代所有出現的位置。
- String 不可變:replace() 會回傳新字串。
- 較複雜的規則請使用帶有正則表示式的 replaceAll()。
7. 方法 trim() 與 strip():移除兩端空白
兩者都會移除字串開頭與結尾的「不可見」字元。
- trim() —— 傳統方法:會移除空白、定位字元、換行與部分控制字元,但不涵蓋所有 Unicode 空白。
- strip() —— 現代方法:依 Unicode 標準考慮所有空白。新專案建議優先使用。
使用範例:
String s1 = " Hello, world! ";
System.out.println(s1.trim());
// 輸出:"Hello, world!"
String s2 = " \u2005 Java 11 \u2005 "; // \u2005 是 Unicode 空白
System.out.println("trim(): " + s2.trim());
System.out.println("strip(): " + s2.strip());
// 輸出:
// trim(): Java 11
// strip(): Java 11
為什麼需要它:
- 清理使用者輸入中多餘的空白。
- 在處理前先標準化從檔案/日誌取得的資料。
8. 實作:動手解題
任務 1:檢查密碼長度
String password = "qwerty";
if (password.length() < 8)
{
System.out.println("密碼太短!");
}
else
{
System.out.println("密碼可用。");
}
任務 2:從全名中擷取名字
String fullName = "Ivanov Ivan Ivanovich";
int firstSpace = fullName.indexOf(' ');
String name = fullName.substring(firstSpace + 1, fullName.indexOf(' ', firstSpace + 1));
System.out.println("名字:" + name); // "Ivan"
任務 3:檢查字串是否以特定字母開頭
String surname = "Petrov";
if (surname.charAt(0) == 'P')
{
System.out.println("姓氏以字母 P 開頭");
}
任務 4:從 email 取得網域
String email = "vasya.pupkin@gmail.com";
int at = email.indexOf('@');
String domain = email.substring(at + 1);
System.out.println("網域:" + domain); // "gmail.com"
任務 5:找出字母 'a' 的所有出現位置
String s = "abracadabra";
int pos = s.indexOf('a');
while (pos != -1)
{
System.out.println("字母 'a' 出現在位置:" + pos);
pos = s.indexOf('a', pos + 1); // 從上一次找到的位置之後繼續尋找
}
9. 使用 String 方法時的常見錯誤
錯誤 №1:超出字串範圍
很常把索引弄混,進而存取不存在的字元/子字串。
String s = "Java";
char c = s.charAt(4); // 錯誤!索引為 0..3
String s = "Hello";
String sub = s.substring(3, 10); // 錯誤!字串長度為 5
錯誤 №2:混淆是否包含結尾索引
方法 substring(start, end) 會包含索引為 start 的字元,但不包含索引為 end 的字元。
錯誤 №3:以為找不到子字串時 indexOf 不會回傳 -1
使用前請先檢查結果,特別是在之後要把它用於 substring 的情況。
錯誤 №4:未正確處理空字串
若字串為空(""),呼叫 charAt(0) 或 substring(0, 1) 都會引發錯誤。請先檢查長度。
錯誤 №5:處理為 null 的字串
如果字串為 null,呼叫任何方法(length()、substring() 等)都會拋出 NullPointerException。在處理前務必先檢查 null。
GO TO FULL VERSION