Java Collections – hashCode() และ equals() – วิธีการแทนที่ equals() และ hashcode() Method ใน Java?

เผยแพร่แล้ว: 2018-08-08
Java Collections hashCode และเท่ากับ

equals() และ hashCode() ใน Java เป็นวิธีการพื้นฐานสองวิธีซึ่งประกาศไว้ในคลาสอ็อบเจ็กต์และไลบรารี Java บางส่วนหรือหลัก

หากคุณมีข้อกังวลข้อใดข้อหนึ่งด้านล่างใน Java คุณมาถูกที่แล้ว

  • Java Practices -> Implementing equals
  • แทนที่ – การแทนที่เท่ากับและ hashCode ใน Java
  • วิธีการแทนที่เท่ากับ () วิธีการใน java
  • วิธีแทนที่เมธอด hashCode() ใน java
  • วิธีการแทนที่เท่ากับและวิธีการ hashCode ใน Java
  • อย่างไรและทำไมต้องแทนที่วิธีเท่ากับใน Java
  • เหตุใดจึงแทนที่ hashcode() เสมอ หากการแทนที่เท่ากับ ()

มาดูตัวอย่างง่ายๆ เพื่อทำความเข้าใจ Reference Equality และ Logical Equality ก่อน ตัวดำเนินการความเท่าเทียมกัน (==) เปรียบเทียบการอ้างอิง (ที่อยู่ในหน่วยความจำ) ของสตริงทั้งสองเป็นตัวเลขที่แตกต่างกันสองตัว ซึ่งเรียกว่า Reference equality

Logical equality เปรียบเทียบข้อมูลของวัตถุแทนที่จะเป็นค่าของข้อมูลอ้างอิง

เอาท์พุท:

hashCode และ เท่ากับ มีความเกี่ยวข้องอย่างใกล้ชิด:

  • หากคุณแทนที่ equals คุณต้องแทนที่ hashCode
  • hashCode ต้องสร้างค่าที่เท่ากันสำหรับอ็อบเจกต์ที่เท่ากัน
  • เท่ากับ และ hashCode ต้องขึ้นอยู่ same set of significant fields เดียวกัน คุณต้องใช้ฟิลด์ชุดเดียวกันในทั้งสองวิธี คุณไม่จำเป็นต้องใช้ฟิลด์ทั้งหมด ตัวอย่างเช่น เขตข้อมูลจากการคำนวณที่ขึ้นอยู่กับช่องอื่นๆ ควรละเว้นจาก equals และ hashCode

เมื่อใช้งาน เท่ากับ ฟิลด์จะถูกเปรียบเทียบแตกต่างกันตามประเภท:

  • ฟิลด์อ็อบเจ็กต์รวมถึงคอลเล็กชัน : use equals
  • type-safe enumerations : ใช้ เท่ากับ หรือ == (ในกรณีนี้จะเท่ากัน)
  • ฟิลด์ออบเจ็กต์อาจเป็นโมฆะ: ใช้ทั้ง == และ เท่ากับ
  • ฟิลด์อาร์เรย์ : ใช้ Arrays.equals
  • ฟิลด์ดั้งเดิมอื่นที่ไม่ใช่ float หรือ double : use ==
  • float : แปลงเป็น int โดยใช้ Float.floatToIntBits , จากนั้นใช้ ==
  • double : แปลงเป็น long โดยใช้ Double.doubleToLongBits จากนั้นใช้ ==

การใช้ hashCode :

  • หากคลาสแทนที่ เท่ากับ จะต้องแทนที่ hashCode
  • เมื่อทั้งสองถูกแทนที่ เท่ากับ และ hashCode ต้องใช้เขตข้อมูลชุดเดียวกัน
  • ถ้าสองอ็อบเจ็กต์เท่ากัน ค่า hashCode ของพวกมันจะต้องเท่ากันด้วย
  • หากวัตถุไม่เปลี่ยนรูป hashCode เป็นตัวเลือกสำหรับการแคชและการเริ่มต้นที่ขี้เกียจ

เป็นความเข้าใจผิดที่เป็นที่นิยมที่ hashCode จัดเตรียมตัวระบุเฉพาะสำหรับอ็อบเจ็กต์ มันไม่ใช่.

ตามสัญญาทั่วไป เมธอด equals() ใน Java จะต้องเป็นแบบสะท้อนกลับ สมมาตร สกรรมกริยา สอดคล้องกัน และการอ้างอิงที่ไม่ใช่ค่าว่างใดๆ จะต้องคืนค่าเท็จ กล่าวอีกนัยหนึ่ง สำหรับค่า a, b และ c โดยพลการ การทดสอบต่อไปนี้จะต้องผ่านเสมอ:

สำหรับแนวทางปฏิบัติที่ดีที่สุด ให้ใช้ขั้นตอนด้านล่างเพื่อนำวิธี equals() ไปใช้:

  • ใช้สิ่งนี้ == เพื่อตรวจสอบความเท่าเทียมกันอ้างอิง
  • ใช้ instanceof เพื่อทดสอบประเภทอาร์กิวเมนต์ที่ถูกต้อง
  • ส่งอาร์กิวเมนต์เป็นประเภทที่ถูกต้อง
  • เปรียบเทียบช่องที่สำคัญเพื่อความเท่าเทียมกัน

นี่คือตัวอย่างที่สมบูรณ์

CrunchifyImplementEqualsHashCode.java

เอาต์พุตคอนโซล Eclipse: