ใน 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 ของคุณได้อย่างมีประสิทธิภาพและแม่นยำ