Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

เปรียบเทียบ String ใน Java: equals, equalsIgnoreCase และ ทำไมห้ามใช้ ==

การเปรียบเทียบ 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 Stringswitch(str) (Java 7+)
❌ ห้ามใช้str1 == str2

บทความเกี่ยวข้อง