equals()
equals() ใช้สำหรับเปรียบเทียบเนื้อหาของออบเจ็กต์ว่าเหมือนกันหรือไม่ มักเรียกว่าการเปรียบเทียบความเท่าเทียมกัน (equality comparison) และหากไม่ได้กำหนด equals() เอง ระบบจะใช้ == ภายใน ซึ่งเป็นการเปรียบเทียบเอกลักษณ์ (identity comparison) ดังนั้น หากต้องการเปรียบเทียบความเท่าเทียมกันของออบเจ็กต์อย่างถูกต้อง ควรใช้ equals() เสมอ
hashCode()
hashCode() ใช้ตรวจสอบว่าออบเจ็กต์สองตัวเป็นออบเจ็กต์เดียวกันหรือไม่ มีฟังก์ชันการเปรียบเทียบเอกลักษณ์ (identity comparison) เหมือนกับ == แต่ hashCode() จะคืนค่าจำนวนเต็มที่ไม่ซ้ำกันของออบเจ็กต์ในขณะรันไทม์ โดยทั่วไปแล้วจะคืนค่าที่อยู่หน่วยความจำของออบเจ็กต์ที่เก็บอยู่ใน Heap
เมธอดนี้มีคีย์เวิร์ด native ซึ่งหมายความว่า หากใช้ภาษาอื่นที่พัฒนาขึ้นนอกเหนือจาก Java ใน Java จะต้องใช้คีย์เวิร์ดนี้
แฮชคืออะไร?
การแฮช (Hashing) คือกระบวนการสร้างค่าเอาต์พุตที่มีขนาดคงที่จากค่าอินพุตที่มีขนาดแตกต่างกัน โดยใช้ฟังก์ชันแฮช (Hash Function) ค่าที่ได้จากการแฮชเรียกว่า แฮชโค้ด (Hash Code)
equals() และ hashCode()
เนื่องจากออบเจ็กต์เดียวกันต้องมีที่อยู่หน่วยความจำเดียวกัน ดังนั้น ออบเจ็กต์เดียวกันจึงต้องมีแฮชโค้ดเดียวกัน ซึ่งเป็นเรื่องที่เห็นได้ชัด ดังนั้น จึงควรเขียนโค้ดเพื่อให้แน่ใจว่ามีแฮชโค้ดเดียวกันโดยการกำหนด hashCode() ใหม่ควบคู่ไปกับ equals()
โครงสร้างข้อมูลแฮช
ลองใส่ Object ที่เท่ากัน 2 ออบเจ็กต์ลงในโครงสร้างข้อมูล HashSet ดังที่แสดงข้างต้น ผลลัพธ์ที่ได้จากการพิมพ์ขนาดของ Set นี้คือ 2 ทำไมถึงเป็นเช่นนั้น?
นั่นเป็นเพราะโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการกำหนด Key กล่าวคือ ก่อนที่จะเปรียบเทียบว่าออบเจ็กต์นั้นเหมือนกันหรือไม่ ระบบจะเปรียบเทียบแฮชโค้ดของออบเจ็กต์สองตัวก่อน แล้วจึงตัดสินว่าออบเจ็กต์สองตัวนั้นเท่ากันหรือไม่ ในกรณีนี้ หากไม่ได้กำหนด hashCode() เอง ระบบจะใช้ hashCode() ของ Object ดังนั้น ระบบจะคืนค่าที่อยู่หน่วยความจำที่ออบเจ็กต์แต่ละตัวถูกเก็บไว้ ดังนั้น สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช จึงควรกำหนด hashCode() ใหม่ควบคู่ไปกับ equals()
แหล่งที่มา
คำถามสัมภาษณ์ที่คาดหวังและคำตอบ
ทำไมต้องใช้ equals() และ hashCode() ร่วมกัน?
นั่นเป็นเพราะโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการกำหนด Key กล่าวคือ ก่อนที่จะเปรียบเทียบว่าออบเจ็กต์นั้นเหมือนกันหรือไม่ ระบบจะเปรียบเทียบแฮชโค้ดของออบเจ็กต์สองตัวก่อน แล้วจึงตัดสินว่าออบเจ็กต์สองตัวนั้นเท่ากันหรือไม่ ในกรณีนี้ หากไม่ได้กำหนด hashCode() เอง ระบบจะใช้ hashCode() ของ Object ดังนั้น ระบบจะคืนค่าที่อยู่หน่วยความจำที่ออบเจ็กต์แต่ละตัวถูกเก็บไว้ ดังนั้น สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช จึงควรกำหนด hashCode() ใหม่ควบคู่ไปกับ equals()
ความคิดเห็น0