เปรียบเทียบเทียบกับตัวเปรียบเทียบใน Java
ความแตกต่างที่สำคัญระหว่าง Comparable และ Comparator ใน Java
- เทียบเคียงได้ใน Java เป็นวัตถุสำหรับเปรียบเทียบตัวเองกับวัตถุอื่น ในขณะที่ Comparator เป็นวัตถุสำหรับเปรียบเทียบวัตถุต่าง ๆ จากคลาสต่าง ๆ
- เปรียบเทียบให้
compareTo()
วิธีการจัดเรียงองค์ประกอบใน Javaในขณะที่ Comparator ให้compare()
วิธีการจัดเรียงองค์ประกอบใน Java. - มีอินเทอร์เฟซที่เทียบเคียงได้
java.lang
package ในขณะที่มีอินเทอร์เฟซ Comparator อยู่java.util
บรรจุภัณฑ์ - Comparable ให้ลำดับการเรียงลำดับเดียว ในขณะที่ Comparator ให้ลำดับการเรียงลำดับหลายรายการ
- Comparable ส่งผลต่อคลาสดั้งเดิม ในขณะที่ Comparator ไม่มีผลกับคลาสดั้งเดิม

ที่นี่ ฉันได้วิเคราะห์ความแตกต่างระหว่างการเปรียบเทียบและตัวเปรียบเทียบ และจะประเมินข้อดีและข้อเสียอย่างครอบคลุม
สิ่งที่เปรียบเทียบได้ใน Java?
เทียบเคียง in Java เป็นวัตถุที่เปรียบเทียบตัวเองกับวัตถุอื่น ช่วยในการเรียงลำดับรายการของวัตถุที่กำหนดเอง Java.lang. อินเทอร์เฟซที่เปรียบเทียบได้ควรได้รับการนำไปใช้โดยคลาสเพื่อเปรียบเทียบอินสแตนซ์ของมัน อาร์เรย์ของอ็อบเจ็กต์ที่ใช้งานอินเทอร์เฟซที่เปรียบเทียบได้จะถูกเรียงลำดับโดยอัตโนมัติตาม Arrays.sort
และ Collections.sort
วิธีการ
วิธีที่ใช้ในการเปรียบเทียบ
ฉันอยากจะเน้นวิธีการสำคัญที่ฉันมักใช้ในอินเทอร์เฟซที่เปรียบเทียบได้:
เปรียบเทียบกับ():
วิธี CompareTo() ใช้ในการเรียงลำดับสตริงแบบธรรมชาติ ความหมายของการเรียงลำดับแบบธรรมชาติคือลำดับการเรียงลำดับที่ใช้กับอ็อบเจ็กต์ เช่น ลำดับตัวเลขสำหรับการเรียงลำดับจำนวนเต็ม ลำดับตัวอักษรสำหรับสตริง เป็นต้น
ไวยากรณ์ของ CompareTo()
วิธีการมีดังนี้:
int compareTo(T obj)
ในรูปแบบข้างต้น T หมายถึงประเภทของออบเจ็กต์ที่คุณจะเปรียบเทียบ
CompareTo()
วิธีการเปรียบเทียบวัตถุกับ T obj
Output:
- จะส่งกลับ 0 ถ้าค่าเท่ากัน
- หากวัตถุมีค่าต่ำกว่า วิธีการนี้จะส่งคืนค่าลบ
- หากวัตถุมีค่าสูงกว่าก็จะส่งกลับค่าบวก
ตัวอย่างการเปรียบเทียบใน Java
โปรแกรมต่อไปนี้ Java ตัวอย่างการเปรียบเทียบแสดงให้เห็นการเปรียบเทียบระหว่างตัวอักษรสองตัว คือ “a” และ “b” โดยตัวอักษร “a” จะอยู่ก่อนตัวอักษร “b” ตามลำดับตัวอักษร
ดังนั้นเอาท์พุตคือ -1 อักขระ "b" มาหลัง "a" ตามลำดับตัวอักษร ดังนั้น ผลลัพธ์ที่ได้คือ 1 อักขระ "a" และ "b" มีค่าเท่ากันทั้งคู่ ดังนั้นเอาต์พุตจึงเป็น 0
public class Sample_String { public static void main(String[] args) { String str_Sample = "a"; System.out.println("Compare To 'a' b is : " + str_Sample.compareTo("b")); str_Sample = "b"; System.out.println("Compare To 'b' a is : " + str_Sample.compareTo("a")); str_Sample = "b"; System.out.println("Compare To 'b' b is : " + str_Sample.compareTo("b")); } }
เอาท์พุต
Compare To 'a' b is : -1 Compare To 'b' a is : 1 Compare To 'b' b is : 0
ตัวเปรียบเทียบคืออะไร Java?
นักเปรียบเทียบ in Java เป็นวัตถุสำหรับเปรียบเทียบวัตถุต่าง ๆ จากคลาสต่าง ๆ อินเทอร์เฟซตัวเปรียบเทียบใน Java ยังใช้ในการจัดเรียงอ็อบเจ็กต์ของคลาสที่ผู้ใช้กำหนด ซึ่งรวมถึงเมธอดอินเทอร์เฟซตัวเปรียบเทียบที่สำคัญสองเมธอดที่เรียกว่า compare (Object obj1, Object obj2) และ equals (Object element)
วิธีที่ใช้ในการเปรียบเทียบ
ในทางปฏิบัติของฉัน ฉันมักจะพึ่งพาวิธีวิจารณ์ต่อไปนี้ของอินเทอร์เฟซตัวเปรียบเทียบ:
เปรียบเทียบ():
Compare()
ช่วยให้คุณสามารถสั่งซื้อวัตถุได้ เมื่อต้องการทำเช่นนี้ คุณต้องสร้างคลาสที่ใช้อินเทอร์เฟซตัวเปรียบเทียบ หลังจากนี้ คุณจะต้องแทนที่วิธีการเปรียบเทียบ
ไวยากรณ์ของ compare()
วิธีการมีดังนี้:
compare(Object obj1, Object obj2)
ในรูปแบบข้างต้น obj1 และ obj2 เป็นวัตถุสองชิ้นที่คุณต้องเปรียบเทียบโดยใช้เมธอด comparison() compare()
วิธี
Output:
- จะส่งกลับจำนวนเต็มลบหากอาร์กิวเมนต์แรกน้อยกว่าอาร์กิวเมนต์ที่สอง
- ส่งกลับค่าศูนย์ถ้าอาร์กิวเมนต์แรกและอาร์กิวเมนต์ที่สองเท่ากัน
- วิธีนี้สามารถส่งคืนจำนวนเต็มบวกในกรณีที่อาร์กิวเมนต์แรกมากกว่าวินาที
คุณต้องแน่ใจว่าความสัมพันธ์เป็นแบบสกรรมกริยา ตัวอย่างเช่น ((compare(a, b)>0) && (compare(b, c)>0)) ซึ่งหมายถึง comparison(a, c)>0
ตัวอย่างการเปรียบเทียบใน Java
ในด้านล่าง Java ตัวอย่างตัวเปรียบเทียบมี 6 ตัว ตัวแปร- “x”, “y”, “p”, “q”, “r” และ “s” เอาต์พุตเป็น -1 เท่ากับค่า "x", 20 น้อยกว่าค่า "y", 30 เอาต์พุตเป็น 0 เนื่องจากค่า "p", 40 เท่ากับค่า "q", 40 .
import java.lang.Integer; public class example { public static void main(String args[]) { int x = 20; int y = 30; // as 10 less than 20, // Output will be a value less than zero System.out.println(Integer.compare(x, y)); int p = 40; int q = 40; // as 30 equals 30, // Output will be zero System.out.println(Integer.compare(p, q)); int r = 20; int s = 7; // as 15 is greater than 8, // Output will be a value greater than zero System.out.println(Integer.compare(r, s)); } }
Output:
-1 0 1
เท่ากับ():
Equals()
ตรวจสอบว่าวัตถุ number เท่ากับวัตถุซึ่งถูกส่งผ่านเป็นอาร์กิวเมนต์หรือไม่
ไวยากรณ์ของ equals()
วิธีการมีดังนี้:
public boolean equals(Object o)
วิธีการนี้รับพารามิเตอร์สองตัว: 1) วัตถุใดๆ และ 2) ค่าที่ส่งคืน มันจะคืนค่าเป็นจริงหากอาร์กิวเมนต์ที่ส่งไม่เป็นโมฆะและเป็นวัตถุประเภทเดียวกันที่มีค่าตัวเลขเหมือนกัน
ตัวอย่างวิธีเท่ากับ:
ในตัวอย่างด้านล่าง ฉันจะเปรียบเทียบตัวแปรทั้งสี่ตัวด้วยกัน ตัวแปรสามตัวเป็นประเภทจำนวนเต็ม และอีกหนึ่งตัวแปรเป็นประเภทสั้น ผลลัพธ์แรกเป็นเท็จ เนื่องจากค่าของ p ซึ่งก็คือ 5 ไม่เท่ากับค่าของ q ซึ่งก็คือ 20
ผลลัพธ์ที่สองเป็นจริงเนื่องจากค่าของตัวแปร p และ r เท่ากัน ซึ่งก็คือ 5 สุดท้ายผลลัพธ์จะเป็นเท็จ เนื่องจากตัวแปร p และ s มีค่าที่กำหนดต่างกัน
public class Test { public static void main(String args[]) { Integer p = 5; Integer q = 20; Integer r =5; Short s = 5; System.out.println(p.equals(q)); System.out.println(p.equals(r)); System.out.println(p.equals(s)); } }
เอาท์พุต
false true false
ความแตกต่างระหว่าง Comparable และ Comparator ใน Java
ฉันมักพบเห็นความสับสนระหว่าง Java Comparable และ Comparator ความแตกต่างหลักๆ มีดังนี้:
เกณฑ์การเปรียบเทียบ | เทียบเคียง | เปรียบเทียบ |
---|---|---|
วิธี | เทียบเคียงให้ compareTo() วิธีการจัดเรียงองค์ประกอบใน Java. |
เครื่องเปรียบเทียบให้ compare() วิธีการจัดเรียงองค์ประกอบใน Java. |
แพ็คเกจ | มีอินเทอร์เฟซที่เทียบเคียงได้ java.lang บรรจุภัณฑ์ |
มีอินเทอร์เฟซตัวเปรียบเทียบอยู่ใน java.util บรรจุภัณฑ์ |
ตรรกะของการเรียงลำดับ | ตรรกะของการเรียงลำดับจะต้องอยู่ในคลาสเดียวกันกับวัตถุที่คุณจะเรียงลำดับ | ตรรกะของการเรียงลำดับควรอยู่ในคลาสที่แยกจากกันเพื่อเขียนการเรียงลำดับที่แตกต่างกันตามคุณลักษณะที่แตกต่างกันของวัตถุ |
วัตถุคลาส | คลาสที่มีวัตถุที่คุณต้องการเรียงลำดับต้องใช้อินเทอร์เฟซที่เปรียบเทียบได้ | คลาสที่มีอ็อบเจ็กต์ที่คุณต้องการเรียงลำดับไม่จำเป็นต้องใช้อินเทอร์เฟซตัวเปรียบเทียบ |
การเรียงลำดับลำดับ | มันมีลำดับการเรียงลำดับเดี่ยว | มีลำดับการเรียงลำดับหลายแบบ |
การเรียงลำดับ | วิธีนี้สามารถจัดเรียงข้อมูลตามลำดับการเรียงลำดับตามธรรมชาติ | วิธีนี้จะเรียงลำดับข้อมูลตามลำดับการจัดเรียงที่กำหนดเอง |
ชั้น | มันส่งผลต่อคลาสเดิม กล่าวคือ ชั้นเรียนที่แท้จริงมีการเปลี่ยนแปลง | ไม่ส่งผลกระทบต่อคลาสดั้งเดิม กล่าวคือ คลาสจริงจะไม่ถูกเปลี่ยนแปลง |
การใช้ | ใช้งานบ่อยครั้งใน API ตามปฏิทิน คลาส Wrapper วันที่ และ สตริง |
มันถูกนำไปใช้เพื่อเรียงลำดับอินสแตนซ์ของคลาสบุคคลที่สาม |
Implement | คลาส wrapper และคลาสสตริงทั้งหมดใช้อินเทอร์เฟซที่เทียบเคียงได้ | คลาส Comparator ที่ใช้งานเพียงคลาสเดียวคือ Collator และ RuleBasedColator |
แนวทางปฏิบัติที่ดีที่สุดในการใช้ตัวเปรียบเทียบและตัวเปรียบเทียบได้ใน Java
- ใช้อินเทอร์เฟซที่เทียบเคียงได้เมื่อการเปรียบเทียบเป็นมาตรฐานสำหรับคลาสเฉพาะ
- คุณสามารถใช้แลมบ์ดากับตัวเปรียบเทียบได้
- คลาสหลักจำนวนมากที่มีอยู่ใช้อินเทอร์เฟซที่เทียบเคียงได้
- คุณสามารถใช้ TreeSet และ TreeMap ในขณะที่เรียงลำดับ Set หรือ Map
- เค้ก
compareTo()
วิธีการทำงานร่วมกับตัวเปรียบเทียบและการเปรียบเทียบ - ใช้อินเทอร์เฟซตัวเปรียบเทียบเฉพาะเมื่อคุณ < ต้องการความยืดหยุ่นมากขึ้นเท่านั้น
- เค้ก
compareTo()
เมธอดจะส่งกลับจำนวนเต็มบวกหากวัตถุแรกมากกว่าอีกอัน ส่งกลับค่าลบหากต่ำกว่า และศูนย์หากทั้งคู่เท่ากัน
วิธีการเลือกระหว่างตัวเปรียบเทียบและตัวเปรียบเทียบ
สรุปแล้ว ประสบการณ์จริงของฉันชี้ให้เห็นว่าการใช้ประโยชน์จาก Comparable และ Comparator ใน Java ยกระดับการควบคุมที่มีต่อการเรียงลำดับข้อมูลอย่างมีนัยสำคัญ ซึ่งช่วยเพิ่มทั้งประสิทธิภาพและการใช้งาน