วิธีการเปรียบเทียบสตริง 2 ตัวใน Java: วิธีและตัวอย่าง

ใน Java สตริง ซึ่งแสดงโดยคลาส String เป็นลำดับอักขระพื้นฐานและไม่สามารถเปลี่ยนแปลงได้ งานทั่วไปอย่างหนึ่งเมื่อทำงานกับสตริงคือ การเปรียบเทียบสตริง ซึ่งจำเป็นสำหรับการดำเนินการต่างๆ เช่น การตรวจสอบความถูกต้องของอินพุต การเรียงลำดับ และอัลกอริทึมการค้นหา บทความนี้จะสำรวจวิธีการต่างๆ ที่มีอยู่ใน Java เพื่อเปรียบเทียบสตริงสองสตริงอย่างมีประสิทธิภาพ โดยให้ตัวอย่างที่ชัดเจนสำหรับแต่ละเทคนิค การเข้าใจ วิธีการเปรียบเทียบสตริง 2 ตัวใน Java เป็นสิ่งสำคัญสำหรับนักพัฒนา Java ทุกคน

วิธีการทั่วไปสำหรับการเปรียบเทียบสตริงใน Java

Java มีเมธอดในตัวหลายวิธีในการเปรียบเทียบสตริง ซึ่งแต่ละวิธีมีไว้สำหรับความต้องการในการเปรียบเทียบที่แตกต่างกัน ลองเจาะลึกวิธีการที่ใช้บ่อยที่สุด

1. การใช้เมธอด equals() สำหรับการเปรียบเทียบเนื้อหา

วิธีที่ตรงไปตรงมาและใช้บ่อยที่สุดสำหรับการเปรียบเทียบสตริงใน Java คือ equals() เมธอดนี้มุ่งเน้นไปที่การเปรียบเทียบ เนื้อหา ของสตริงสองสตริง จะส่งคืนค่า true หากเนื้อหาของสตริงทั้งสองเหมือนกันทุกประการ และส่งคืนค่า false หากไม่เป็นเช่นนั้น ความไวต่อตัวพิมพ์ใหญ่-เล็กเป็นสิ่งสำคัญที่นี่ "Hello" และ "hello" ถือว่าแตกต่างกันโดย equals()

ตัวอย่าง:

public class CompareStrings {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "Geeks";
        String s3 = "Hello";

        System.out.println(s1.equals(s2)); // Output: false
        System.out.println(s1.equals(s3)); // Output: true
    }
}

คำอธิบาย:

ในตัวอย่างนี้ s1.equals(s2) ส่งคืนค่า false เนื่องจากเนื้อหาของ "Hello" และ "Geeks" แตกต่างกัน อย่างไรก็ตาม s1.equals(s3) ส่งคืนค่า true เนื่องจากทั้ง s1 และ s3 มีลำดับอักขระเดียวกันคือ “Hello”

2. การใช้ equalsIgnoreCase() สำหรับการเปรียบเทียบที่ไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก

หากคุณต้องการเปรียบเทียบสตริงโดยไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็กของอักขระ equalsIgnoreCase() เป็นวิธีที่เหมาะสม เมธอดนี้จะส่งคืนค่า true หากเนื้อหาของสตริงเหมือนกัน โดยไม่คำนึงว่าอักขระจะเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก

ตัวอย่าง:

public class CompareStrings {
    public static void main(String args[]) {
        String s1 = new String("Java");
        String s2 = new String("JAVA");

        System.out.println(s1.equalsIgnoreCase(s2)); // Output: true
    }
}

คำอธิบาย:

ที่นี่ s1.equalsIgnoreCase(s2) ส่งคืนค่า true เพราะแม้ว่า "Java" และ "JAVA" จะมีตัวพิมพ์ที่แตกต่างกัน equalsIgnoreCase() จะถือว่าเท่ากันเมื่อเปรียบเทียบเนื้อหา

3. การใช้ compareTo() สำหรับการเปรียบเทียบตามลำดับพจนานุกรม

เมธอด compareTo() นำเสนอวิธีการเปรียบเทียบสตริงที่ละเอียดอ่อนกว่า มันทำการเปรียบเทียบตามลำดับพจนานุกรม ซึ่งหมายความว่าจะเปรียบเทียบสตริงตามค่า Unicode ของอักขระ compareTo() ไม่ได้ส่งคืนค่าบูลีนเพียงอย่างเดียว มันส่งคืนค่าจำนวนเต็มที่ระบุความสัมพันธ์ระหว่างสตริงสองสตริง:

  • ค่าบวก: หากสตริงแรกมีค่ามากกว่าสตริงที่สองตามลำดับพจนานุกรม
  • ศูนย์: หากสตริงทั้งสองเท่ากันตามลำดับพจนานุกรม
  • ค่าลบ: หากสตริงแรกมีค่าน้อยกว่าสตริงที่สองตามลำดับพจนานุกรม

ตัวอย่าง:

public class CompareStrings {
    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = "Domain";

        System.out.println(s1.compareTo(s2)); // Output: 6
    }
}

คำอธิบาย:

ในตัวอย่างนี้ s1.compareTo(s2) ส่งคืนค่า 6 ค่าบวกนี้บ่งชี้ว่า "Java" มาหลัง "Domain" ตามลำดับพจนานุกรม ค่าเฉพาะ ‘6’ คือความแตกต่างของค่า Unicode ระหว่างอักขระที่แตกต่างกันตัวแรก ‘J’ (Unicode 74) และ ‘D’ (Unicode 68)

หมายเหตุ: compareTo() คำนึงถึงตัวพิมพ์ใหญ่-เล็ก

4. การใช้ Objects.equals() สำหรับการเปรียบเทียบที่ปลอดภัยจากค่า Null

เมธอด Objects.equals() เป็นเมธอดยูทิลิตี้จากคลาส Objects ที่ให้วิธีการตรวจสอบความเท่าเทียมกันที่ปลอดภัยจากค่า null มันจัดการกรณีที่สตริงหนึ่งหรือทั้งสองอาจเป็น null ได้อย่างราบรื่น ป้องกันข้อผิดพลาด NullPointerException

  • หากอาร์กิวเมนต์ทั้งสองเป็น null จะส่งคืนค่า true
  • หากอาร์กิวเมนต์หนึ่งเป็น null และอีกอาร์กิวเมนต์หนึ่งไม่ใช่ จะส่งคืนค่า false
  • มิฉะนั้น จะใช้วิธี equals() ของอาร์กิวเมนต์แรกเพื่อกำหนดความเท่าเทียมกัน

ตัวอย่าง:

import java.util.Objects;

public class CompareStrings {
    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = null;

        System.out.println(Objects.equals(s1, s2));     // Output: false
        System.out.println(Objects.equals(null, null));   // Output: true
    }
}

คำอธิบาย:

Objects.equals(s1, s2) ส่งคืนค่า false เนื่องจาก s2 เป็น null Objects.equals(null, null) ส่งคืนค่า true เนื่องจากทั้งสองเป็น null เมธอดนี้หลีกเลี่ยงปัญหา NullPointerException ที่อาจเกิดขึ้นได้หากคุณเรียก s1.equals(s2) โดยตรงเมื่อ s1 อาจเป็น null

5. ฟังก์ชันที่ผู้ใช้กำหนดโดยใช้ compareTo() (ตามลำดับพจนานุกรม)

แม้ว่า Java จะมีเมธอดในตัว แต่คุณยังสามารถสร้างฟังก์ชันของคุณเองเพื่อเปรียบเทียบสตริง ซึ่งอาจปรับแต่งตรรกะการเปรียบเทียบ ตัวอย่างเช่น คุณสามารถสร้างฟังก์ชันที่ใช้ compareTo() เพื่อดำเนินการเปรียบเทียบตามลำดับพจนานุกรมและส่งคืนผลลัพธ์จำนวนเต็มที่อธิบายได้มากกว่า

ตัวอย่าง:

public class CompareStrings {
    public static int compareStrings(String s1, String s2) {
        return s1.compareTo(s2);
    }

    public static void main(String[] args) {
        String s1 = "Java";
        String s2 = "Domain";
        int result = compareStrings(s1, s2);
        System.out.println("" + result); // Output: 6
    }
}

คำอธิบาย:

ตัวอย่างนี้กำหนดฟังก์ชัน compareStrings ที่เพียงแค่รวมเมธอด compareTo() แม้ว่าตัวอย่างเฉพาะนี้จะไม่เพิ่มฟังก์ชันการทำงานมากนัก แต่มันแสดงให้เห็นว่าคุณสามารถห่อหุ้มตรรกะการเปรียบเทียบสตริงภายในฟังก์ชันของคุณเองได้หากจำเป็นสำหรับสถานการณ์ที่ซับซ้อนมากขึ้น

ทำไมไม่ใช้ == สำหรับการเปรียบเทียบสตริง?

สิ่งสำคัญคือต้องเข้าใจว่าทำไมโดยทั่วไปคุณควร หลีกเลี่ยงการใช้โอเปอเรเตอร์ == เพื่อเปรียบเทียบสตริงใน Java โอเปอเรเตอร์ == ใน Java ตรวจสอบ ความเท่าเทียมกันของการอ้างอิง สำหรับออบเจ็กต์ (รวมถึงสตริง) == จะพิจารณาว่าการอ้างอิงสองรายการชี้ไปที่ ออบเจ็กต์เดียวกัน ในหน่วยความจำหรือไม่ ไม่ใช่ว่า เนื้อหา ของออบเจ็กต์จะเหมือนกันหรือไม่

สตริงใน Java เป็นออบเจ็กต์ และแม้ว่าคอมไพเลอร์ Java บางครั้งจะปรับปรุงสตริงลิเทอรัล การใช้ == อาจนำไปสู่ผลลัพธ์ที่ไม่คาดคิดเมื่อเปรียบเทียบออบเจ็กต์สตริงที่สร้างขึ้นในวิธีต่างๆ (เช่น การใช้ new String() หรือได้รับจากอินพุตของผู้ใช้)

เพื่อเปรียบเทียบ เนื้อหา ของสตริงอย่างน่าเชื่อถือ ให้ใช้วิธี equals(), equalsIgnoreCase() หรือ compareTo() เสมอ

สรุป

การเปรียบเทียบสตริงเป็นการดำเนินการพื้นฐานในการเขียนโปรแกรม Java บทความนี้ได้สรุปวิธีการสำคัญหลายประการสำหรับ วิธีการเปรียบเทียบสตริง 2 ตัวใน Java:

  • equals(): สำหรับการเปรียบเทียบเนื้อหาที่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก
  • equalsIgnoreCase(): สำหรับการเปรียบเทียบเนื้อหาที่ไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก
  • compareTo(): สำหรับการเปรียบเทียบตามลำดับพจนานุกรมและการกำหนดลำดับสตริง
  • Objects.equals(): สำหรับการเปรียบเทียบเนื้อหาที่ปลอดภัยจากค่า null

การเลือกวิธีที่ถูกต้องขึ้นอยู่กับความต้องการในการเปรียบเทียบเฉพาะของคุณ สำหรับสถานการณ์ทั่วไปส่วนใหญ่ที่คุณต้องการตรวจสอบว่าสตริงสองสตริงมีเนื้อหาเดียวกันหรือไม่ equals() เป็นวิธีที่แนะนำ จำไว้ว่าให้หลีกเลี่ยงการใช้ == สำหรับการเปรียบเทียบเนื้อหาเพื่อป้องกันปัญหาที่อาจเกิดขึ้น ด้วยการเข้าใจวิธีการเหล่านี้ คุณสามารถเปรียบเทียบสตริงในแอปพลิเคชัน Java ของคุณได้อย่างมีประสิทธิภาพและแม่นยำ

Comments

No comments yet. Why don’t you start the discussion?

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *