1. 引用與內容的比較
在 Java 中,字串是物件,而非基本型別。當你宣告變數 a 與 b 時,它們可能指向字串池中的同一個字串。而透過建構子建立的 c 則是另一個物件。運算子 == 比較的是參考,而不是文字內容。
String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b); // true(很可能是已 intern 的字串)
System.out.println(a == c); // false(不同的物件)
錯誤示範
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); // false
儘管字串看起來相同,它們在記憶體中是不同的物件。
2. equals(): 比較字串內容
若要比較內容,請使用方法 equals()——它會逐字元比較(區分大小寫)。
String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true
範例:比較密碼
String inputPassword = "Secret123";
String realPassword = "Secret123";
if (inputPassword.equals(realPassword))
{
System.out.println("已允許存取!");
}
else
{
System.out.println("密碼不正確。");
}
重要!
如果任一物件等於 null,呼叫 equals() 會導致 NullPointerException。較安全的寫法:
if ("某個值".equals(someString)) { ... }
3. equalsIgnoreCase(): 忽略大小寫的比較
當需要忽略大小寫(例如使用者輸入)時,請使用 equalsIgnoreCase()。
String name1 = "Ivan";
String name2 = "ivan";
System.out.println(name1.equalsIgnoreCase(name2)); // true
範例:比較 email 位址
String email1 = "User@Example.com";
String email2 = "user@example.com";
if (email1.equalsIgnoreCase(email2))
{
System.out.println("電子郵件相同!");
}
簡述: equals vs equalsIgnoreCase
| 方法 | 區分大小寫? | 範例「Java」對「java」 |
|---|---|---|
|
是 | |
|
否 | |
4. compareTo(): 字典序比較
方法 compareTo() 會進行字典序比較。若第一個字串「較小」,回傳負數;0 表示相等;正數表示「較大」。
System.out.println("apple".compareTo("banana")); // < 0
System.out.println("apple".compareTo("apple")); // 0
System.out.println("banana".compareTo("apple")); // > 0
a.compareTo(b) →
< 0 — 若 a 位於 b 之前
0 — 若相等
> 0 — 若 a 位於 b 之後
compareTo() 的結果
它如何運作?
- 比較依 Unicode 碼點由左至右進行。
- 遇到第一個不同處時,會回傳字元碼點的差值。
- 若其中一個字串是另一個的前綴,較短的那個「較小」。
System.out.println("cat".compareTo("catalog")); // < 0 ("cat" 較短)
System.out.println("catalog".compareTo("cat")); // > 0
範例:排序字串陣列
String[] fruits = {"banana", "apple", "pear"};
Arrays.sort(fruits); // 內部使用 compareTo()
System.out.println(Arrays.toString(fruits)); // [apple, banana, pear]
compareToIgnoreCase()
System.out.println("Java".compareToIgnoreCase("java")); // 0
5. 方法 startsWith() 與 endsWith()
方法 startsWith() 與 endsWith() 用來檢查字串的開頭與結尾,回傳 true/false。
String fileName = "document.pdf";
String url = "https://www.google.com";
System.out.println(fileName.startsWith("doc")); // true
System.out.println(fileName.endsWith(".txt")); // false
System.out.println(url.startsWith("https://")); // true
用途:驗證格式(檔名、URL)與依前綴/後綴過濾(例如所有 ".jpg")。
6. 方法 contains(): 尋找子字串
contains(CharSequence s) 是檢查是否包含子字串的簡單方式。此方法區分大小寫。
String text = "歡迎來到 Java 的世界!";
System.out.println(text.contains("世界")); // true
System.out.println(text.contains("C++")); // false
若要忽略大小寫,將兩邊都轉成同一個大小寫:toLowerCase()/toUpperCase()。
7. 方法 toLowerCase() 和 toUpperCase()
會回傳新的字串,轉成小寫或大寫。用於不區分大小寫的比較與格式化十分實用。
String title = "Java Programming";
String lower = title.toLowerCase();
String upper = title.toUpperCase();
System.out.println(lower); // java programming
System.out.println(upper); // JAVA PROGRAMMING
8. 方法 split(): 將字串切成多段
split(String regex) 會依分隔符(正則表達式)切分字串並回傳 String[] 陣列。
範例 1:用逗號切分
String names = "Alex,Maria,Ivan,Elena";
String[] nameArray = names.split(",");
for (String name : nameArray)
{
System.out.println(name.trim()); // trim() 會移除可能的空白
}
// 輸出:
// Alex
// Maria
// Ivan
// Elena
範例 2:用空白切分
String sentence = "我 在 學習 Java";
String[] words = sentence.split(" ");
for (String word : words)
{
System.out.println(word);
}
// 輸出:
// 我
// 在
// 學習
// Java
注意事項:
- 分隔符是正則表達式。特殊字元需要跳脫(例如點號:"\\.")。
- 此方法一律回傳陣列,即使只有一個元素。
9. 實作:在真實應用程式中比較字串
String registeredEmail = "user@example.com";
String registeredPassword = "Secret123";
Scanner console = new Scanner(System.in);
System.out.print("請輸入 email: ");
String email = console.nextLine();
System.out.print("請輸入密碼: ");
String password = console.nextLine();
// email 忽略大小寫比較;密碼則區分大小寫
if (email.equalsIgnoreCase(registeredEmail) && password.equals(registeredPassword))
{
System.out.println("歡迎!");
}
else
{
System.out.println("電子郵件或密碼不正確。");
}
說明:電子郵件使用 equalsIgnoreCase(),密碼則用嚴格的 equals()。字串不可使用運算子 ==——它比較的是參考。
10. 比較字串的常見錯誤
錯誤 1:用 == 比較字串,而不是 equals()
運算子 == 比較的是參考而非內容,因此結果可能出乎意料。
錯誤 2:在可能為 null 的物件上呼叫 equals()
請在確定非 null 的物件上呼叫方法,或使用 Objects.equals(a, b)。
錯誤 3:在必須區分大小寫時卻忽略大小寫
例如,密碼必須區分大小寫。務必確認需求。
錯誤 4:將字串與其他型別的物件比較
"123" 與 123 並不相同。equals() 並不會自動轉型。
錯誤 5:對大小寫混雜的字串進行排序
大寫字母通常排在小寫之前。若要忽略大小寫排序,使用 Arrays.sort(array, String.CASE_INSENSITIVE_ORDER)。
GO TO FULL VERSION