Java String equals()

equals() 方法用來比較兩個字串的內容是否相同。

語法

string.equals(Object obj)
string.equalsIgnoreCase(String anotherString)

為什麼不能用 == 比較字串?

== 比較的是記憶體位址,不是字串內容:

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
比較字串內容時,一定要使用 equals(),不要用 ==

equals() 範例

String s1 = "Hello";
String s2 = "Hello";
String s3 = "hello";
String s4 = null;

System.out.println(s1.equals(s2));  // true
System.out.println(s1.equals(s3));  // false(區分大小寫)
System.out.println(s1.equals(s4));  // false

// 避免 NullPointerException 的寫法
System.out.println("Hello".equals(s4));  // false(不會拋出例外)

equalsIgnoreCase()

忽略大小寫比較:

String s1 = "Hello";
String s2 = "HELLO";
String s3 = "hello";

System.out.println(s1.equalsIgnoreCase(s2));  // true
System.out.println(s1.equalsIgnoreCase(s3));  // true

compareTo()

比較字串的大小(字典順序):

String s1 = "apple";
String s2 = "banana";
String s3 = "apple";

System.out.println(s1.compareTo(s2));  // 負數(s1 < s2)
System.out.println(s2.compareTo(s1));  // 正數(s2 > s1)
System.out.println(s1.compareTo(s3));  // 0(相等)

// compareToIgnoreCase() 忽略大小寫
System.out.println("Apple".compareToIgnoreCase("apple"));  // 0

compareTo() 回傳值:

  • 負數:呼叫的字串較小
  • 0:兩字串相等
  • 正數:呼叫的字串較大

實際應用

登入驗證

String inputPassword = "abc123";
String correctPassword = "ABC123";

// 區分大小寫
if (inputPassword.equals(correctPassword)) {
    System.out.println("登入成功");
} else {
    System.out.println("密碼錯誤");
}

指令處理

String command = "QUIT";

if (command.equalsIgnoreCase("quit")) {
    System.out.println("結束程式");
}

排序字串陣列

String[] fruits = {"banana", "apple", "cherry"};

// 使用 compareTo() 排序
Arrays.sort(fruits);

for (String fruit : fruits) {
    System.out.println(fruit);
}
// apple, banana, cherry

安全的比較方式

避免 NullPointerException:

String userInput = getUserInput();  // 可能是 null

// 不安全
// if (userInput.equals("quit")) { ... }  // 可能 NullPointerException

// 安全方式 1:常數在前
if ("quit".equals(userInput)) {
    System.out.println("結束");
}

// 安全方式 2:先檢查 null
if (userInput != null && userInput.equals("quit")) {
    System.out.println("結束");
}

// 安全方式 3:使用 Objects.equals()
import java.util.Objects;
if (Objects.equals(userInput, "quit")) {
    System.out.println("結束");
}

String Pool 與 ==

String Pool 是 Java 用來節省記憶體的機制:

String s1 = "Hello";       // 在 String Pool 中
String s2 = "Hello";       // 同一個物件
String s3 = new String("Hello");  // 新物件
String s4 = s3.intern();   // 加入 String Pool

System.out.println(s1 == s2);  // true
System.out.println(s1 == s3);  // false
System.out.println(s1 == s4);  // true

即使 == 有時候可以正確比較字串,但為了程式碼的可靠性,永遠使用 equals()