CodeGym /課程 /JAVA 25 SELF /字串比較:equals, equalsIgnoreCase, compareTo

字串比較:equals, equalsIgnoreCase, compareTo

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

1. 引用與內容的比較

在 Java 中,字串是物件,而非基本型別。當你宣告變數 ab 時,它們可能指向字串池中的同一個字串。而透過建構子建立的 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」
equals()
false
equalsIgnoreCase()
true

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)。

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