JAVAPRO_IR Telegram 4534
⚖️ چرا باید 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
👍62



tgoop.com/javapro_ir/4534
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

With the “Bear Market Screaming Therapy Group,” we’ve now transcended language. A vandalised bank during the 2019 protest. File photo: May James/HKFP. With the administration mulling over limiting access to doxxing groups, a prominent Telegram doxxing group apparently went on a "revenge spree." Hashtags Informative
from us


Telegram برنامه نویسی جاوا | Java
FROM American