การเปรียบเทียบ String ใน Java เป็นพื้นฐานที่สำคัญ แต่หลายคนเข้าใจผิด ใช้ == แทน .equals() บทความนี้อธิบายความต่างและ best practices
1. equals() - คำนึงถึง Case (Case-Sensitive)
String first = "Test123";
String second = "Test" + 123; // "Test123"
String third = "TEST123";
if (first.equals(second)) {
System.out.println("first และ second เท่ากัน"); // ✅ พิมพ์
}
if (first.equals(third)) {
System.out.println("first และ third เท่ากัน"); // ❌ ไม่พิมพ์ (case ต่าง)
}
2. equalsIgnoreCase() - ไม่คำนึงถึง Case (Case-Insensitive)
if (first.equalsIgnoreCase(second)) {
System.out.println("เท่ากัน (ignore case)"); // ✅
}
if (first.equalsIgnoreCase(third)) {
System.out.println("เท่ากัน (ignore case)"); // ✅ พิมพ์
}
3. ทำไมห้ามใช้ == เปรียบเทียบ String
== เปรียบเทียบ Reference (Address ใน Memory) ไม่ใช่ค่า (Value)
String first = "Test123";
String second = "Test123"; // String Literal - อยู่ใน String Pool
String third = new String("Test123"); // Object ใหม่ใน Heap
System.out.println(first == second); // true (ชี้ object เดียวกันใน Pool)
System.out.println(first == third); // false ❌ (object ต่างกันใน Heap)
System.out.println(first.equals(third)); // true ✅ (ค่าเท่ากัน)
🔑 จำไว้:
==ตรวจสอบว่า "ชี้ไป object เดียวกันไหม" |.equals()ตรวจสอบว่า "ค่าเท่ากันไหม"
4. เปรียบเทียบกับค่าคงที่ (Null-Safe)
วิธีเก่า: Yoda Notation
String foo = null;
if ("baz".equals(foo)) { // ไม่โยน NPE แม้ foo จะเป็น null
System.out.println("Match");
} else {
System.out.println("Not match or null"); // พิมพ์บรรทัดนี้
}
วิธีใหม่: Objects.equals() (Java 7+ ✅ แนะนำ)
import java.util.Objects;
String foo = null;
if (Objects.equals(foo, "baz")) { // Null-safe, อ่านง่ายกว่า
System.out.println("Match");
}
✅ Objects.equals(a, b) จัดการ null ให้ทั้งคู่ คืนค่า true ถ้าทั้งคู่ null
5. Switch Statement กับ String (Java 7+)
String grade = "A";
switch (grade) {
case "A":
System.out.println("Excellent");
break;
case "B":
System.out.println("Good");
break;
default:
System.out.println("Invalid grade");
}
// ใช้ equals() ภายใน เปรียบเทียบ case-sensitive
// ⚠️ ต้องเช็ค null ก่อน switch ไม่งั้นโยน NPE
สรุป: การเลือกใช้
| สถานการณ์ | วิธีที่แนะนำ |
|---|---|
| เปรียบเทียบ 2 String ปกติ (Case-sensitive) | str1.equals(str2) |
| เปรียบเทียบ 2 String (ไม่คำนึง Case) | str1.equalsIgnoreCase(str2) |
| เปรียบเทียบกับค่าคงที่ (อาจเป็น null) | Objects.equals(str, "const") |
| Switch case String | switch(str) (Java 7+) |
| ❌ ห้ามใช้ | str1 == str2 |