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