ความแตกต่างที่สำคัญ – เท่ากับ vs hashCode ใน Java
ค่าเท่ากับคล้ายกับตัวดำเนินการ==ซึ่งก็คือการทดสอบเอกลักษณ์ของวัตถุมากกว่าความเท่าเทียมกันของวัตถุ hashCode เป็นวิธีการที่คลาสแบ่งย่อยข้อมูลที่จัดเก็บไว้ในอินสแตนซ์ของคลาสโดยนัยหรือโดยชัดแจ้งเป็นค่าแฮชเดียว ซึ่งเป็นจำนวนเต็มที่ลงนาม 32 บิต ความแตกต่างที่สำคัญระหว่าง equals และ hashCode ใน Java ก็คือ ความเท่าเทียมนั้นใช้เพื่อเปรียบเทียบสองอ็อบเจ็กต์ ในขณะที่ hashCode ใช้ในการแฮชเพื่อตัดสินใจว่าควรจัดหมวดหมู่ออบเจ็กต์กลุ่มใด
Java เท่ากับเท่าไหร่
วิธีเท่ากับใช้เพื่อเปรียบเทียบวัตถุสองชิ้นค่าดีฟอลต์เท่ากับวิธีการที่กำหนดไว้ในคลาสอ็อบเจ็กต์ การใช้งานนั้นคล้ายกับตัวดำเนินการ==การอ้างอิงวัตถุทั้งสองจะเท่ากันก็ต่อเมื่อชี้ไปที่วัตถุเดียวกัน เป็นไปได้ที่จะแทนที่วิธีการเท่ากับ
รูปที่ 01: โปรแกรม Java เท่ากับ
คำสั่ง System.out.println(s1.equals(s2)) จะให้คำตอบเป็นเท็จเพราะ s1 และ s2 อ้างถึงวัตถุสองชิ้นที่แตกต่างกัน คล้ายกับคำสั่ง System.out.println(s1==s2);
คำสั่ง System.out.println(s1.equals(s3)) จะให้คำตอบเป็นจริงเพราะ s1 และ s3 อ้างถึงวัตถุเดียวกัน คล้ายกับคำสั่ง System.out.println(s1==s3);
ในชั้นเรียนนักเรียนไม่มีทางเท่ากัน ดังนั้นจึงเรียกว่าเท่ากับในคลาส Object True จะแสดงก็ต่อเมื่อการอ้างอิงวัตถุชี้ไปที่วัตถุเดียวกัน
รูปที่ 02: โปรแกรม Java ที่มีการแทนที่เท่ากับ
ตามโปรแกรมด้านบน วิธีเท่ากับถูกแทนที่ ออบเจ็กต์ถูกส่งไปยังเมธอด และเป็นประเภทส่งไปยัง Student จากนั้น ค่า id จะถูกตรวจสอบ ถ้าค่า id ใกล้เคียงกัน มันจะคืนค่า true ถ้าไม่เช่นนั้นจะคืนค่าเท็จ รหัสของ s1 และ s2 มีความคล้ายคลึงกัน ดังนั้นมันจะพิมพ์จริง รหัสของ s1 และ s3 ก็คล้ายกัน ดังนั้นมันจะพิมพ์จริง
hashCode ใน Java คืออะไร
hashCode ใช้ในการแฮชเพื่อตัดสินใจว่าควรจัดหมวดหมู่วัตถุในกลุ่มใด กลุ่มของวัตถุสามารถแบ่งปัน hashCode เดียวกันได้ ฟังก์ชันแฮชที่ถูกต้องสามารถกระจายอ็อบเจ็กต์ออกเป็นกลุ่มต่างๆ ได้เท่าๆ กัน
hashCode ที่ถูกต้องสามารถมีคุณสมบัติดังนี้สมมติว่ามีสองวัตถุเป็น obj1 และ obj2 ถ้า obj1.equals(obj2) เป็นจริง ดังนั้น obj1.hashCode() จะเท่ากับ obj2.hashCode() หาก obj1.equals(obj2) เป็นเท็จ ไม่จำเป็นที่ obj1.hashCode() จะต้องไม่เท่ากับ obj2.hashCode() ออบเจ็กต์ที่ไม่เท่ากันทั้งสองอาจมี hashCode เหมือนกัน
รูปที่ 03: ชั้นเรียนของนักเรียนที่มีค่าเท่ากับและแฮชโค้ด
ภาพที่ 04: โปรแกรมหลัก
ชั้นเรียนของนักเรียนประกอบด้วยเมธอด equals และ hashCode วิธีเท่ากับในคลาส Student จะได้รับวัตถุ หากวัตถุเป็นโมฆะ จะส่งกลับค่าเท็จถ้าคลาสของอ็อบเจ็กต์ไม่เหมือนกัน มันจะคืนค่าเท็จ ค่า id ถูกตรวจสอบในวัตถุทั้งสอง หากคล้ายกันก็จะคืนค่าเป็นจริง มิฉะนั้นจะคืนค่าเท็จ
ในโปรแกรมหลัก วัตถุ s1 และ s2 จะถูกสร้างขึ้น เมื่อเรียก s1.equals(s2) จะให้เป็นจริง เนื่องจากเมธอด equals ถูกแทนที่ และจะตรวจสอบค่า id ของทั้งสองอ็อบเจ็กต์ แม้ว่าพวกเขาจะอ้างถึงวัตถุสองชิ้น แต่คำตอบก็เป็นจริงเพราะค่า id ของ s1 และ s2 เหมือนกัน เนื่องจาก s1.equals(s2) เป็นจริง hashCode ของ s1 และ s2 ควรเท่ากัน การพิมพ์ hashCode ของ s1 และ s2 จะให้ค่าเท่ากัน สามารถใช้วิธี hashCode กับคอลเลกชั่น เช่น HashMap
ความแตกต่างระหว่าง equals และ hashCode ใน Java คืออะไร
เท่ากับเทียบกับ hashCode ใน Java |
|
equals เป็นวิธีการใน Java ที่ทำหน้าที่คล้ายกับตัวดำเนินการ==ซึ่งใช้ทดสอบเอกลักษณ์ของวัตถุมากกว่าความเท่าเทียมกันของวัตถุ | hashCode เป็นวิธีการที่คลาสแบ่งย่อยข้อมูลที่จัดเก็บไว้ในอินสแตนซ์ของคลาสเป็นค่าแฮชเดียวโดยปริยายหรือชัดเจน |
การใช้งาน | |
วิธีการเท่ากับใช้เพื่อเปรียบเทียบสองวัตถุ | วิธีการนี้ใช้ในการแฮชเพื่อตัดสินใจว่าควรวางวัตถุในกลุ่มใด |
สรุป – เท่ากับเทียบกับ hashCode ใน Java
ความแตกต่างในเท่ากับและ hashCode ใน Java คือ ความเท่าเทียมกันถูกใช้เพื่อเปรียบเทียบสองวัตถุในขณะที่ hashCode ใช้ในการแฮชเพื่อตัดสินใจว่าควรจัดหมวดหมู่วัตถุกลุ่มใด