ก่อนอื่น เพื่อทำความเข้าใจบทบาทของ hashCode คุณต้องรู้จักคอลเลคชันใน Java ก่อน
โดยทั่วไปแล้ว คอลเลกชั่นใน Java มีสองประเภท ประเภทแรกคือรายการ และอีกประเภทคือชุด
คุณรู้ถึงความแตกต่างของพวกเขาหรือไม่? องค์ประกอบในชุดก่อนหน้าได้รับการจัดลำดับ และสามารถทำซ้ำองค์ประกอบได้ องค์ประกอบในชุดหลังจะไม่เรียงลำดับ แต่องค์ประกอบไม่สามารถทำซ้ำได้
ดังนั้นนี่คือปัญหาที่ร้ายแรงกว่า: หากคุณต้องการให้แน่ใจว่าองค์ประกอบจะไม่เกิดซ้ำ อะไรควรเป็นพื้นฐานในการตัดสินว่าองค์ประกอบทั้งสองซ้ำกันหรือไม่
นี่คือวิธี Object.equals อย่างไรก็ตาม หากคุณตรวจสอบทุกครั้งที่มีการเพิ่มองค์ประกอบ เมื่อมีองค์ประกอบหลายรายการ จำนวนการเปรียบเทียบระหว่างองค์ประกอบที่เพิ่มในคอลเลกชันจะมีขนาดใหญ่มาก
กล่าวอีกนัยหนึ่ง หากขณะนี้มีองค์ประกอบ 1,000 รายการในคอลเลกชัน ดังนั้นเมื่อมีการเพิ่มองค์ประกอบที่ 1,001 ลงในคอลเลกชัน มันจะเรียกเมธอดเท่ากับ 1,000 ครั้ง สิ่งนี้จะลดประสิทธิภาพลงอย่างมากอย่างเห็นได้ชัด
ดังนั้น Java จึงนำหลักการของตารางแฮชมาใช้ จริงๆ แล้วแฮชเป็นชื่อของบุคคล เพราะเขาเสนอแนวคิดของอัลกอริธึมแฮช จึงตั้งชื่อตามเขา
อัลกอริธึมแฮชหรือที่เรียกว่าอัลกอริธึมแฮช กำหนดข้อมูลโดยตรงให้กับที่อยู่ตามอัลกอริธึมเฉพาะ หากคุณอธิบายอัลกอริธึมแฮชโดยละเอียด จะต้องมีความยาวบทความมากกว่านี้ ดังนั้นฉันจะไม่แนะนำมันที่นี่
ผู้เริ่มต้นสามารถเข้าใจได้ว่าเมธอด hashCode ส่งคืนที่อยู่จริงของที่เก็บข้อมูลอ็อบเจ็กต์จริง ๆ (จริงๆ แล้วอาจไม่เป็นเช่นนั้น)
ด้วยวิธีนี้ เมื่อมีการเพิ่มองค์ประกอบใหม่ลงในคอลเลกชัน เมธอด hashCode ขององค์ประกอบนี้จะถูกเรียกเป็นครั้งแรก และสามารถระบุตำแหน่งทางกายภาพที่ควรวางองค์ประกอบนั้นได้ทันที
หากไม่มีองค์ประกอบในตำแหน่งนี้ ก็สามารถจัดเก็บไว้ที่ตำแหน่งนี้ได้โดยตรงโดยไม่ต้องเปรียบเทียบใดๆ ถ้ามีองค์ประกอบอยู่ที่ตำแหน่งนี้อยู่แล้ว
เพียงเรียกวิธีการเท่ากับเพื่อเปรียบเทียบกับองค์ประกอบใหม่ หากไม่เหมือนกัน ที่อยู่อื่นจะถูกแฮช
ดังนั้นจึงมีปัญหาในการแก้ไขข้อขัดแย้งที่นี่ ด้วยวิธีนี้ จำนวนการเรียกวิธีเท่ากับจริงจะลดลงอย่างมาก เกือบเพียงครั้งเดียวหรือสองครั้งเท่านั้น
ดังนั้น Java จึงจัดเตรียมสิ่งนี้สำหรับวิธี eqauls และวิธี hashCode:
1. หากวัตถุสองชิ้นเหมือนกัน ค่า hashCode จะต้องเหมือนกัน 2. หาก hashCode ของวัตถุทั้งสองเหมือนกัน วัตถุเหล่านั้นไม่จำเป็นต้องเหมือนกัน วิธีเท่ากับ
แน่นอนว่าคุณไม่จำเป็นต้องทำตามที่ต้องการ แต่คุณจะพบว่าวัตถุเดียวกันสามารถปรากฏในคอลเลกชัน Set ได้ ในขณะเดียวกัน ประสิทธิภาพในการเพิ่มองค์ประกอบใหม่จะลดลงอย่างมาก วิธีการแฮชโค้ดใช้เพื่อกำหนดว่าวัตถุทั้งสองเท่ากันหรือไม่
แล้วคุณจะบอกว่าไม่มีวิธีที่เรียกว่าเท่ากับเหรอ? ใช่ ทั้งสองวิธีนี้ใช้เพื่อกำหนดว่าวัตถุทั้งสองเท่ากันหรือไม่ แต่พวกเขาแตกต่างออกไป โดยทั่วไปแล้ว ผู้ใช้จะเรียกใช้เมธอดเท่ากับ หากคุณต้องการตรวจสอบว่าวัตถุทั้งสองมีค่าเท่ากันหรือไม่
คุณสามารถแทนที่เมธอดเท่ากับแล้วเรียกมันในโค้ดของคุณเพื่อพิจารณาว่าจะเท่ากันหรือไม่ พูดง่ายๆ ก็คือ ส่วนใหญ่จะใช้วิธีการเท่ากับเพื่อกำหนดว่าวัตถุสองชิ้นเท่ากันเมื่อวัดจากพื้นผิวหรือเนื้อหา เช่น มีชั้นเรียนของนักเรียน
คุณลักษณะเพียงอย่างเดียวคือชื่อและเพศ ดังนั้นเราสามารถคิดได้ว่าตราบใดที่ชื่อและเพศเท่ากัน วัตถุทั้งสองก็จะเท่ากัน โดยทั่วไปผู้ใช้จะไม่เรียกวิธีแฮชโค้ด ตัวอย่างเช่น ในแฮชแมป เนื่องจากคีย์ไม่สามารถทำซ้ำได้
เมื่อเขาตัดสินว่าคีย์ถูกทำซ้ำหรือไม่ เขาก็ตัดสินวิธีแฮชโค้ด และยังใช้วิธีเท่ากับอีกด้วย สิ่งที่ไม่สามารถทำซ้ำได้ที่นี่หมายความว่าตราบใดที่ค่าหนึ่งเท่ากันและแฮชโค้ดไม่เท่ากันก็จะไม่เป็นไร! พูดง่ายๆ ก็คือ hashcode นั้นเทียบเท่ากับการเข้ารหัสของอ็อบเจ็กต์ เช่นเดียวกับ md5 ในไฟล์ มันแตกต่างจากเท่ากับตรงที่ส่งคืนประเภท int ซึ่งเปรียบเทียบได้ยาก โดยทั่วไปเราจะเขียนทับแฮชโค้ดเมื่อแทนที่เท่ากับเพื่อให้ตรรกะสอดคล้องกัน ตัวอย่างเช่น,
ตอนนี้ยังคงใช้ตัวอย่างอยู่ หากชื่อและเพศเท่ากัน แม้ว่าวัตถุทั้งสองจะเท่ากัน ดังนั้นวิธีแฮชโค้ดควรส่งคืนค่าแฮชโค้ดของชื่อบวกกับค่าแฮชโค้ดของเพศ ดังนั้นตามตรรกะแล้ว มีความสอดคล้องกัน .
หากต้องการทราบทางกายภาพว่าวัตถุสองชิ้นเท่ากันหรือไม่ ให้ใช้ ==