tgoop.com/javapro_ir/4534
Last Update:
⚖️ چرا باید equals و hashCode با هم Override شوند؟
برنامهنویسی شیءگرا در جاوا به شدت بر پایهی مقایسهی اشیاء است.
دو متد مهم که در این زمینه نقش حیاتی دارند، equals و hashCode هستند.
📌 متد equals
برای مقایسهی محتوای دو شیء استفاده میشود.
به صورت پیشفرض از کلاس Object به ارث میرسد و فقط مقایسهی آدرس حافظه انجام میدهد.
معمولاً باید آن را Override کنیم تا بتوانیم دو شیء با محتوای یکسان را برابر در نظر بگیریم.
📌 متد hashCode
این متد یک عدد صحیح (int) برمیگرداند که نشاندهندهی یک Hash برای شیء است.
در ساختارهایی مثل HashMap, HashSet و Hashtable برای سریع پیدا کردن اشیاء استفاده میشود.
قرارداد جاوا میگوید:
اگر a.equals(b) درست باشد، باید a.hashCode() == b.hashCode() هم درست باشد.
🔎 مشکل وقتی فقط equals را Override کنیم
import java.util.HashSet;
class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return name.equals(person.name);
}
}
public class Test {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("Ali"));
System.out.println(set.contains(new Person("Ali"))); // false
}
}
📌 توضیح:
ما equals را Override کردیم اما hashCode را نه.
در واقع HashSet ابتدا hashCode را چک میکند تا موقعیت را پیدا کند. چون hashCode پیشفرض برای دو شیء متفاوت است، حتی اگر equals درست باشد، شیء پیدا نمیشود.
🔎 مثال درست با Override هر دو متد
import java.util.HashSet;
import java.util.Objects;
class Person {
String name;
Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
public class Test {
publiSystem.out.println(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("Ali"));
System.out.println(set.contains(new Person("Ali"))); // true
}
}
📌 حالا چون هم equals و هم hashCode درست Override شدهاند، مجموعه به درستی کار میکند.
🎯 جمعبندی
equals:
محتوای اشیاء را مقایسه میکند.
hashCode:
برای جستوجوی سریع در Collectionهای مبتنی بر Hash استفاده میشود.
اگر equals را Override کردید، حتماً باید hashCode را هم Override کنید، وگرنه ساختارهایی مثل HashSet و HashMap رفتار غیرمنتظره خواهند داشت.
#کاربرـپیشرفته
🆔 @javapro_ir
🆔 @group_javapro
BY برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4534