제이온

equals() เทียบกับ hashCode()

สร้าง: 2024-04-25

สร้าง: 2024-04-25 22:29

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

[สำหรับผู้ไม่ใช่ผู้เชี่ยวชาญ ด้านการพัฒนาซอฟต์แวร์ เพื่อความอยู่รอด] 14. สรุปเนื้อหาสัมภาษณ์ทางเทคนิคที่ผู้พัฒนาซอฟต์แวร์มือใหม่ถามบ่อยสรุปคำถามทางเทคนิคที่มักถามในการสัมภาษณ์งานผู้พัฒนาซอฟต์แวร์มือใหม่ (พื้นที่หน่วยความจำ โครงสร้างข้อมูล ฐานข้อมูล ฯลฯ) หวังว่าจะเป็นประโยชน์ในการเตรียมตัวสัมภาษณ์งานด้านการพัฒนา
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

April 3, 2024

[Java] ใช้ Stream ค้นหาจำนวนเฉพาะแบบ Lazyบทความนี้จะแสดงวิธีการค้นหาจำนวนเฉพาะอย่างมีประสิทธิภาพโดยใช้ Java Stream พร้อมกับตัวอย่างการประยุกต์ใช้ Lazy Evaluation โดยเฉพาะอย่างยิ่ง การปรับปรุงประสิทธิภาพผ่านการเพิ่มประสิทธิภาพการคำนวณ sqrt() และการใช้รูปแบบ 6k ± 1
김현이
김현이
김현이
김현이

July 23, 2024

การสร้างแบบจำลองข้อมูลเชิงแนวคิดการสร้างแบบจำลองข้อมูลเชิงแนวคิดเป็นกระบวนการที่ใช้ ERD ในการแสดงเอนทิตีและความสัมพันธ์ เพื่อเป็นพื้นฐานในการออกแบบฐานข้อมูล
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

April 8, 2024

JWT (JSON Web Token) คืออะไร?JWT เป็นมาตรฐานแบบเปิดที่ใช้ JSON object ในการส่งข้อมูลอย่างปลอดภัย ประกอบด้วยส่วนหัว ส่วน payload และลายเซ็น โดยลายเซ็นจะช่วยรับประกันความสมบูรณ์ของข้อมูลและความปลอดภัย ไม่จำเป็นต้องใช้การรักษาสถานะเซสชันฝั่งเซิร์ฟเวอร์ ทำให้มีความสามารถในการปรับขนาดสูง
Seize the day
Seize the day
Seize the day
Seize the day

March 4, 2024

การติดฉลากข้อมูลคืออะไร? ประเภท ข้อดี ข้อเสียการติดฉลากข้อมูลเป็นกระบวนการที่ติดแท็กให้กับข้อมูลเพื่อให้อัลกอริทึมของปัญญาประดิษฐ์สามารถทำความเข้าใจข้อมูลได้ เช่น การแยกแยะระหว่างสุนัขกับแมว ซึ่งสามารถนำไปใช้ได้ในหลายๆ ด้านและช่วยปรับปรุงประสิทธิภาพของแบบจำลอง
세상 모든 정보
세상 모든 정보
세상 모든 정보
세상 모든 정보

March 29, 2024

ความแปรปรวนร่วมและความแปรปรวนตรงข้ามบทความนี้จะอธิบายแนวคิดเรื่องความแปรปรวนร่วมและความแปรปรวนตรงข้าม โดยใช้ตัวอย่าง Animal และ Dog เพื่ออธิบายความแปรปรวนร่วมและความแปรปรวนตรงข้าม และเน้นความจำเป็นของความแปรปรวนตรงข้ามเพื่อเพิ่มความยืดหยุ่นในการจัดการเหตุการณ์ ฯลฯ นอกจากนี้ยังกล่าวถึงความแ
Sunrabbit
Sunrabbit
Sunrabbit
Sunrabbit

November 1, 2024