เมื่อคุณสร้างวัตถุคู่คีย์ของคุณเองคุณควรเผชิญหน้ากับบางสิ่ง
ครั้งแรกที่คุณควรจะตระหนักถึงการดำเนินการและ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
.
หากคุณสงสัยเกี่ยวกับรอบชิงชนะเลิศฉันขอประกาศว่าค่าใดเป็นค่าสุดท้ายที่กำหนดในอินสแตนซ์และไม่เคยเปลี่ยนแปลง - ดังนั้นจึงเป็นค่าคงที่ของวัตถุ