CodeGym /課程 /JAVA 25 SELF /String 的基本方法

String 的基本方法

JAVA 25 SELF
等級 9 , 課堂 3
開放

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) —— 從位置 startIndexendIndex(不包含索引為 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 < 0endIndex > 長度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

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION