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: |

The SUCK Channel on Telegram, with a message saying some content has been removed by the police. Photo: Telegram screenshot. Users are more open to new information on workdays rather than weekends. Members can post their voice notes of themselves screaming. Interestingly, the group doesn’t allow to post anything else which might lead to an instant ban. As of now, there are more than 330 members in the group. How to create a business channel on Telegram? (Tutorial) Those being doxxed include outgoing Chief Executive Carrie Lam Cheng Yuet-ngor, Chung and police assistant commissioner Joe Chan Tung, who heads police's cyber security and technology crime bureau.
from us


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