เมื่อคุณสร้างวัตถุคู่คีย์ของคุณเองคุณควรเผชิญหน้ากับบางสิ่ง
ครั้งแรกที่คุณควรจะตระหนักถึงการดำเนินการและhashCode() equals()คุณจะต้องดำเนินการนี้
ประการที่สองเมื่อใช้งานhashCode()โปรดตรวจสอบให้แน่ใจว่าคุณเข้าใจวิธีการทำงาน ตัวอย่างผู้ใช้ที่กำหนด
public int hashCode() {
return this.x ^ this.y;
}
เป็นหนึ่งในการใช้งานที่แย่ที่สุดที่คุณสามารถทำได้ เหตุผลง่ายๆคือคุณมีแฮชที่เท่ากันเยอะมาก! และhashCode()ควรคืนค่า int ที่มักจะหายากไม่ซ้ำใครจะดีที่สุด ใช้สิ่งนี้:
public int hashCode() {
return (X << 16) + Y;
}
รวดเร็วและส่งคืนแฮชเฉพาะสำหรับคีย์ระหว่าง -2 ^ 16 และ 2 ^ 16-1 (-65536 ถึง 65535) เหมาะกับเกือบทุกกรณี ไม่ค่อยมีคุณอยู่นอกขอบเขตนี้
ประการที่สามเมื่อนำไปใช้equals()ควรรู้ด้วยว่ามันถูกใช้เพื่ออะไรและตระหนักถึงวิธีที่คุณสร้างคีย์ของคุณเนื่องจากมันเป็นวัตถุ บ่อยครั้งที่คุณทำโดยไม่จำเป็นหากงบทำให้คุณจะได้ผลลัพธ์เดียวกันเสมอ
หากคุณสร้างคีย์เช่นนี้map.put(new Key(x,y),V);คุณจะไม่เปรียบเทียบการอ้างอิงคีย์ของคุณ ทุกสาเหตุที่คุณต้องการ acces map.get(new Key(x,y));แผนที่คุณจะทำสิ่งที่ชอบ ดังนั้นคุณไม่จำเป็นต้องมีคำสั่งเช่นequals() if (this == obj)มันจะไม่เกิดขึ้น
แทนที่จะif (getClass() != obj.getClass())ของคุณในการใช้งานที่ดีขึ้นequals() if (!(obj instanceof this))จะใช้ได้แม้กระทั่งสำหรับคลาสย่อย
ดังนั้นสิ่งเดียวที่คุณต้องเปรียบเทียบคือ X และ Y ดังนั้นequals()การนำไปใช้งานที่ดีที่สุดในกรณีนี้คือ:
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
ดังนั้นในที่สุดคลาสสำคัญของคุณก็เป็นเช่นนี้:
public class Key {
public final int X;
public final int Y;
public Key(final int X, final int Y) {
this.X = X;
this.Y = Y;
}
public boolean equals (final Object O) {
if (!(O instanceof Key)) return false;
if (((Key) O).X != X) return false;
if (((Key) O).Y != Y) return false;
return true;
}
public int hashCode() {
return (X << 16) + Y;
}
}
คุณสามารถให้ดัชนีมิติข้อมูลXและYระดับการเข้าถึงสาธารณะได้เนื่องจากข้อมูลดังกล่าวถือเป็นที่สิ้นสุดและไม่มีข้อมูลที่ละเอียดอ่อน ฉันไม่แน่ใจ 100% ว่าprivateระดับการเข้าถึงทำงานอย่างถูกต้องหรือไม่ในกรณีใด ๆเมื่อส่งObjectไปยังไฟล์Key.
หากคุณสงสัยเกี่ยวกับรอบชิงชนะเลิศฉันขอประกาศว่าค่าใดเป็นค่าสุดท้ายที่กำหนดในอินสแตนซ์และไม่เคยเปลี่ยนแปลง - ดังนั้นจึงเป็นค่าคงที่ของวัตถุ