![translation](https://cdn.durumis.com/common/trans.png)
นี่คือโพสต์ที่แปลด้วย AI
เลือกภาษา
สรุปโดย AI ของ durumis
- `equals()` เป็นเมธอดที่ใช้เปรียบเทียบเนื้อหาของวัตถุว่าเหมือนกันหรือไม่ และ `hashCode()` เป็นเมธอดที่คืนค่าจำนวนเต็มที่ไม่ซ้ำกันของวัตถุ ทั้งสองอย่างนี้ใช้สำหรับเปรียบเทียบวัตถุ
- ในโครงสร้างข้อมูลแฮช `hashCode()` ถูกใช้เพื่อกำหนดคีย์ ดังนั้นคุณจะต้องกำหนด `equals()` และ `hashCode()` ใหม่ด้วยกันเพื่อให้แน่ใจว่ารหัสแฮชเหมือนกัน
- การใช้ `equals()` และ `hashCode()` ร่วมกันช่วยให้คุณจัดการวัตถุที่เหมือนกันในโครงสร้างข้อมูลแฮชได้อย่างมีประสิทธิภาพ
equals()
equals() เป็นการเปรียบเทียบเนื้อหาของวัตถุว่าเหมือนกันหรือไม่ มักเรียกว่าการเปรียบเทียบความเท่าเทียมกัน และถ้าไม่ได้กำหนด equals() ใหม่ จะมีการเปรียบเทียบเหมือนกันภายใน เหมือนกับ == ดังนั้น หากต้องการเปรียบเทียบวัตถุอย่างเท่าเทียมกันอย่างถูกต้อง คุณต้องใช้ equals()
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() ตรวจสอบว่าวัตถุสองชิ้นเป็นวัตถุเดียวกันหรือไม่ ทำงานเหมือนกับการเปรียบเทียบเหมือนกัน == แต่เมธอด hashCode() จะส่งคืนค่าจำนวนเต็มเฉพาะของวัตถุในระหว่างรันไทม์ โดยทั่วไปจะส่งคืนที่อยู่หน่วยความจำของวัตถุที่เก็บไว้ใน Heap
เมธอดนี้มีคำสำคัญ native ซึ่งหมายความว่าเป็นคำสำคัญที่ใช้เมื่อใช้ภาษาที่พัฒนาขึ้นในภาษาอื่นนอกเหนือจาก Java ใน Java
แฮชคืออะไร?
การแฮชคือกระบวนการใช้ฟังก์ชันแฮชเพื่อสร้างค่าเอาต์พุตขนาดคงที่จากค่าอินพุตที่มีขนาดแปรผัน ค่าที่ได้รับจากการแฮชเรียกว่าแฮชโค้ด
equals() และ hashCode()
วัตถุเดียวกันต้องมีที่อยู่หน่วยความจำเดียวกัน ดังนั้นจึงเป็นที่ชัดเจนว่าวัตถุเดียวกันต้องมีแฮชโค้ดเดียวกัน ดังนั้นจึงเป็นการดีกว่าที่จะเขียนโค้ดเพื่อให้มั่นใจว่า แฮชโค้ดเดียวกัน โดยการกำหนด equals() และ hashCode() ใหม่ด้วยกัน
โครงสร้างข้อมูลแฮช
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
ลองใส่オブジェクトที่เหมือนกัน 2 อันในโครงสร้างข้อมูล HashSet ดังที่แสดงด้านบน เมื่อพิมพ์ขนาดของเซ็ตนี้ จะได้ 2 ทำไม มันจะเป็นแบบนั้น?
เนื่องจากโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการตัดสินใจ Key นั่นหมายความว่า ก่อนที่จะเปรียบเทียบว่าวัตถุนั้นเหมือนกันหรือไม่ จะเปรียบเทียบว่าแฮชโค้ดของวัตถุทั้งสองนั้นเหมือนกันหรือไม่ และจากนั้นจึงตัดสินใจว่าวัตถุทั้งสองนั้นเหมือนกันหรือไม่ ในกรณีนี้ หาก hashCode() ไม่ได้กำหนดใหม่ จะใช้ hashCode() ของวัตถุ ดังนั้นที่อยู่หน่วยความจำที่วัตถุแต่ละชิ้นถูกเก็บไว้จะถูกส่งคืน ดังนั้นจึงเป็นการดีกว่าที่จะกำหนด hashCode() ใหม่นอกเหนือจาก equals() สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
ที่มา
คำถามและคำตอบที่คาดหวังในการสัมภาษณ์
ทำไมต้องใช้ equals() และ hashCode() ร่วมกัน?
เนื่องจากโครงสร้างข้อมูลที่ใช้แฮชจะใช้ hashCode() ในการตัดสินใจ Key นั่นหมายความว่า ก่อนที่จะเปรียบเทียบว่าวัตถุนั้นเหมือนกันหรือไม่ จะเปรียบเทียบว่าแฮชโค้ดของวัตถุทั้งสองนั้นเหมือนกันหรือไม่ และจากนั้นจึงตัดสินใจว่าวัตถุทั้งสองนั้นเหมือนกันหรือไม่ ในกรณีนี้ หาก hashCode() ไม่ได้กำหนดใหม่ จะใช้ hashCode() ของวัตถุ ดังนั้นที่อยู่หน่วยความจำที่วัตถุแต่ละชิ้นถูกเก็บไว้จะถูกส่งคืน ดังนั้นจึงเป็นการดีกว่าที่จะกำหนด hashCode() ใหม่นอกเหนือจาก equals() สำหรับกรณีที่ใช้โครงสร้างข้อมูลแฮช