Telegram Web
🚀 فرصت شغلی: توسعه‌دهنده بک‌اند جاوا

ما به دنبال یک بک‌اند دولوپر جاوا ماهر هستیم با تخصص در فرآیندهای منابع انسانی و سیستم‌های برنامه‌ریزی شیفت.

🔹 در این نقش شما مسئول:

طراحی و توسعه راهکارهای بک‌اند مقیاس‌پذیر

پشتیبانی از مدیریت نیروی کار و جریان‌های کاری HR

همکاری نزدیک با مدیر محصول، کارشناسان HR و تیم فرانت‌اند

بهینه‌سازی فرآیندهای شیفت و ارائه تجربه کاربری بهتر


💻 موقعیت: کاملاً ریموت
💵 پرداخت: دلاری

🛠️ مهارت‌های مورد نیاز:

حداقل ۵ سال تجربه به‌عنوان Java Backend Developer

تسلط به:

Java 17+

Spring Boot 🌱

REST APIها 🔗

معماری مایکروسرویس ⚙️


تجربه کار با سیستم‌های HR و برنامه‌ریزی شیفت

مهارت حل مسئله و تبدیل نیازهای HR به راهکار مقیاس‌پذیر

توانایی کار تیمی و ارتباط مؤثر 🤝


📚 ابزارها و تکنولوژی‌ها:

MongoDB 🍃

Redis

Keycloak 🔐

Kubernetes (basic) ☸️

Git & Git workflows 🔄

ارتباط انگلیسی قوی ✍️🗣️

شرایط همکاری:

همکاری تمام‌وقت و ریموت 🏠

پرداخت دلاری بر اساس توانایی و تجربه 💵

فرصت کار روی پروژه‌های واقعی و مقیاس‌پذیر 🚀

تیم حرفه‌ای و فضای رشد فردی 🌟

📩 رزومه خود را ارسال کنید به:
[email protected]


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
برنامه نویسی جاوا | Java pinned «🎓لیست دوره های آموزشی آکادمی جاواپرو: 💎 دوره پرتاب | آموزش پیش نیازهای برنامه نویسی 💎دوره مقدماتی جاوا 💎 دوره شاهکار پیشرفته جاوا 💎دوره طلایی Spring Core 💎دوره فریمورک Spring Boot 💎دوره پروژه محور Spring Boot-سیستم دانشگاه 💎دوره دژبان Spring Security…»
🎓نام دوره : مینی دوره اپلیکیشن TODO

معرفی دوره : دوره «پیاده‌سازی پروژه ToDo با Spring Boot» یک دوره عملی و پروژه‌محوره که به شما کمک می‌کنه مفاهیم اصلی Spring Boot رو در قالب ساخت یک اپلیکیشن کاربردی واقعی یاد بگیرید.

🚀دستاورد های دوره :

- آشنایی با ساختار پروژه در Spring Boot

- طراحی و پیاده‌سازی موجودیت‌ها (Entities) با JPA/Hibernate

- ایجاد و مدیریت پایگاه داده با Spring Data JPA

- ساخت APIهای RESTful برای مدیریت تسک‌ها (ایجاد، ویرایش، حذف، لیست‌کردن)

- استفاده از Lombok برای ساده‌سازی کد

- معماری لایه‌ای (Controller, Service, Repository) در Spring Boot

فهرست
جلسه 0 : مقدمه
جلسه 1 : بررسی نیازمندی ها
جلسه 2 : ایجاد پروژه و فایل داکر
جلسه 3 : مدل ها
جلسه 4 : سرویس ها و ریپایزیتوری ها (بخش اول)
جلسه 5 : سرویس ها و ریپایزیتوری ها (بخش دوم)
جلسه 6 : کنترلر ها (بخش اول)
جلسه 7:  کنترلر ها (بخش دوم)

💸قیمت: رایگان

🖥ثبت نام[کلیک کنید]


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
3🎉1😍1
برنامه نویسی جاوا | Java pinned «🎓لیست دوره ها: 💎 دوره پرتاب | آموزش پیش نیازهای برنامه نویسی 💎دوره مقدماتی جاوا 💎 دوره شاهکار پیشرفته جاوا 💎دوره طلایی Spring Core 💎دوره فریمورک Spring Boot 💎دوره پروژه محور Spring Boot-سیستم دانشگاه 💎دوره دژبان Spring Security ⚡️دوره جامع نخبگان…»
🔗 Chaining در CompletableFuture

یکی از قدرت‌های بزرگ CompletableFuture اینه که می‌تونی چندین عملیات Async رو زنجیروار به هم وصل کنی.
این کار باعث می‌شه کدت مرتب‌تر، خواناتر و حرفه‌ای‌تر بشه.


مثال ۱: استفاده از thenApply
import java.util.concurrent.CompletableFuture;

public class ThenApplyExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture
            .supplyAsync(() -> "Hello")
            .thenApply(s -> s + " World")
            .thenApply(s -> s.toUpperCase());

        System.out.println(future.join());
    }
}

📌 توضیح:

supplyAsync مقدار "Hello" برمی‌گردونه.

thenApply روی نتیجه عملیات قبلی اعمال می‌شه.

خروجی نهایی: HELLO WORLD


مثال ۲: استفاده از thenCompose (برای تو در تو بودن Async)
import java.util.concurrent.CompletableFuture;

public class ThenComposeExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture
            .supplyAsync(() -> "User123")
            .thenCompose(user -> getUserProfile(user));

        System.out.println(future.join());
    }

    static CompletableFuture<String> getUserProfile(String user) {
        return CompletableFuture.supplyAsync(() -> "Profile of " + user);
    }
}

📌 توضیح:

thenCompose برای زمانی به کار می‌ره که متد قبلی خودش یه CompletableFuture برگردونه.

اینطوری از Future<Future<T>> جلوگیری می‌کنیم و مستقیم یه Future ساده داریم.


مثال ۳: ترکیب چند Future با thenCombine
import java.util.concurrent.CompletableFuture;

public class ThenCombineExample {
    public static void main(String[] args) {
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");

        CompletableFuture<String> combined = future1.thenCombine(future2, (a, b) -> a + " " + b);

        System.out.println(combined.join());
    }
}

📌 توضیح:

thenCombine دو Future رو ترکیب می‌کنه.

نتیجه: Hello World


🎯 جمع‌بندی

thenApply →
تغییر نتیجه‌ی عملیات قبلی.

thenCompose →
برای عملیات Async تو در تو.

thenCombine →
ترکیب نتایج دو Future مختلف.


با استفاده از این متدها می‌تونی Pipeline‌های Async قدرتمند بسازی که هم سریع‌تر هستن و هم مدیریت‌شون راحت‌تره.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍41
👨‍💻 فرصت‌های شغلی بین‌المللی (ریموت)
ما در حال تشکیل یک تیم بین‌المللی هستیم و به دنبال توسعه‌دهندگان سینیور در موقعیت‌های زیر می‌باشیم:

۱. Senior Java Developer – Remote
📝 توضیح: همکاری در پروژه‌های چالش‌برانگیز با فناوری‌های مدرن و محیط کاملاً ریموت.
💰 حقوق: 2000 تا 3500 دلار (بسته به تجربه)
🌐 زبان انگلیسی: حداقل C1
مهارت‌ها:

تجربه حرفه‌ای با Java، Spring Boot، Hibernate

آشنایی با معماری Microservices و RESTful API

کار با دیتابیس‌های SQL و NoSQL

توانایی حل مسئله و کدنویسی تمیز

۲. Senior Golang Developer – Remote
📝 توضیح: پیوستن به تیم بین‌المللی و توسعه سرویس‌های مقیاس‌پذیر.
💰 حقوق: 2000 تا 3000 دلار
🌐 زبان انگلیسی: حداقل C1
مهارت‌ها:

تسلط بر Golang و طراحی API

آشنایی با معماری Microservices

تجربه با دیتابیس‌ها و Cache (PostgreSQL، MongoDB، Redis)

تسلط بر Git و فرآیندهای CI/CD

۳. Senior React Native Developer – Remote
📝 توضیح: توسعه اپلیکیشن‌های موبایل برای بازار بین‌المللی در محیطی ریموت.
💰 حقوق: 2000 تا 3000 دلار
🌐 زبان انگلیسی: حداقل C1
مهارت‌ها:

تجربه حرفه‌ای با React Native و JavaScript/TypeScript

آشنایی با RESTful API و GraphQL

تجربه با state management (Redux، MobX یا مشابه)

ارائه کد تمیز و تست‌پذیر

📧 ارسال رزومه:
[email protected]


---

⚠️ درج آگهی استخدام برنامه نویسی جاوا در جاواپرو رایگان است.
جاواپرو هیچ‌گونه مسئولیتی در مورد تأیید یا عدم اعتبار آگهی ندارد و صرفاً جهت اطلاع‌رسانی منتشر می‌شود.


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
شانس در موفقیت نقش دارد، اما شانس فقط به سراغ کسی می‌آید که آماده باشد.

آمادگی یعنی:

مهارت‌های لازم را یاد گرفته باشی،

زبان بلد باشی،

ظرفیت‌های شخصی و حرفه‌ای‌ات را پرورش داده باشی.


وگرنه حتی اگر همین امروز اعلام کنند:
«به متخصص جاوا در یک شرکت معتبر داخلی یا خارجی نیاز داریم»
باید از خودت بپرسی:
🔹 آیا من خودم را برای چنین فرصتی آماده کرده‌ام؟


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
تمامی جلسات مینی دوره اپلیکیشن TODO با فریمورک Spring Boot را در کانال یوتیوب جاواپرو می توانید به صورت یکجا و فهرست بندی شده تماشا کنید.

⬇️جهت مشاهده روی لینک زیر کلیک کنید:

▶️مشاهده

👤کانال یوتیوب جاواپرو رو دوست داشتید سابسکرایب کنید چون دوره های رایگان جاوا رو در اینجا هم قرار میدیم.


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
🧠 مدل حافظه در جاوا (Java Memory Model) و نقش volatile

مدل حافظه در جاوا یا JMM مشخص می‌کند که چگونه Threadها به حافظه دسترسی دارند و چه زمانی تغییرات در متغیرها توسط سایر Threadها دیده می‌شود.
این موضوع اهمیت زیادی در برنامه‌های هم‌زمان (Concurrent) دارد، چون بدون آن نتایج غیرقابل پیش‌بینی رخ خواهد داد.



📌 مسئله‌ی اصلی: Visibility و Reordering

برنامه‌های چندنخی در جاوا روی پردازنده‌ها اجرا می‌شوند و پردازنده‌ها برای افزایش سرعت، دستورها را ممکن است بازچینی (Reorder) کنند. همچنین هر Thread معمولاً داده‌ها را در Cache محلی خودش نگه می‌دارد.

به همین دلیل دو مشکل اصلی ایجاد می‌شود:

Visibility (قابلیت مشاهده):
یک Thread مقدار جدید متغیر را تغییر می‌دهد اما سایر Threadها همچنان مقدار قدیمی را می‌بینند.

Reordering (بازچینی):
دستورها توسط CPU یا کامپایلر جابه‌جا می‌شوند و در نتیجه Thread دیگر ترتیب مورد انتظار را نمی‌بیند.



نقش volatile

کلمه‌ی کلیدی volatile به جاوا می‌گوید که:

1. همیشه مقدار متغیر از حافظه اصلی (Main Memory) خوانده شود.


2. هر تغییر در متغیر بلافاصله برای سایر Threadها قابل مشاهده باشد.


3. بازچینی دستورها (Reordering) برای دسترسی به این متغیر ممنوع شود.




🔎 مثال بدون volatile (رفتار اشتباه)
public class WithoutVolatile {
    private static boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
            while (running) {
                // مشغول کار
            }
            System.out.println("Worker stopped!");
        });

        worker.start();

        Thread.sleep(1000);
        running = false; // تلاش برای توقف
        System.out.println("Flag set to false");
    }
}

📌 مشکل:

در اینجا ممکن است Thread worker هیچ‌وقت متوقف نشود، چون مقدار running در Cache Thread گیر کرده و تغییرش در Thread اصلی دیده نمی‌شود.



🔎 مثال با volatile (رفتار درست)
public class WithVolatile {
    private static volatile boolean running = true;

    public static void main(String[] args) throws InterruptedException {
        Thread worker = new Thread(() -> {
            while (running) {
                // مشغول کار
            }
            System.out.println("Worker stopped!");
        });

        worker.start();

        Thread.sleep(1000);
        running = false; // توقف درست انجام می‌شود
        System.out.println("Flag set to false");
    }
}

📌 توضیح:

با volatile تغییر مقدار متغیر running بلافاصله به حافظه اصلی فرستاده می‌شود.

بنابراین Thread worker به‌محض تغییر متغیر، مقدار جدید را می‌بیند و متوقف می‌شود.



🎯 جمع‌بندی

در واقع Java Memory Model مشخص می‌کند که Threadها چگونه حافظه را می‌بینند.

مشکلات اصلی در Multithreading Visibility و Reordering هستند.

کلیدواژه volatile تضمین می‌کند که تغییرات یک متغیر بلافاصله توسط همه‌ی Threadها قابل مشاهده باشد و دستورات مربوط به آن بازچینی نشوند.

#کاربرـپیشرفته



🆔 @javapro_ir
🆔 @group_javapro
👍6
▶️دوره Login/Register با توکن Spring Boot در یوتیوب

معرفی دوره

در اغلب وب‌سایت‌ها بخشی برای ورود و ثبت‌نام کاربران وجود دارد. همچنین احتمالاً مشاهده کرده‌اید که برخی بخش‌ها تنها برای کاربران خاصی در دسترس هستند. در این دوره یاد می‌گیرید چگونه با پیاده‌سازی یک سرویس IAM Service و استفاده از APIهای آماده، مفاهیم مربوط به Authorization را به‌صورت عملی درک کرده و پیاده‌سازی کنید. در صورت وجود هرگونه سؤال یا مشکل نیز می‌توانید آن را در گروه تلگرام پرسش‌وپاسخ مطرح کنید.

دستاوردهای دوره:

کار با JWT Token

پیاده‌سازی Authentication

مبانی Spring Security

🎓مخاطبان و پیش‌نیازها:
این دوره برای افرادی طراحی شده است که به زبان Java در سطح مناسبی مسلط باشند.
آشنایی با Maven
سایر مفاهیم مربوط به Spring Boot در طول دوره آموزش داده خواهد شد.

▶️جهت مشاهده این دوره به صورت مرتب و فهرست بندی شده در یوتیوب روی لینک زیر کلیک کنید:
https://youtu.be/56_a2d_LNrk
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
⚖️ تفاوت Checked و Unchecked Exceptions در جاوا

برنامه‌نویسی در جاوا بدون Exception Handling معنایی ندارد. جاوا برای مدیریت خطاها دو نوع Exception تعریف کرده است: Checked و Unchecked. این تمایز به ظاهر ساده است، اما تاثیر بزرگی بر طراحی APIها و ساختار کد دارد.



📌 Checked Exceptions

درواقع Checked Exception ها خطاهایی هستند که کامپایلر شما را مجبور می‌کند مدیریت‌شان کنید.

یا باید آن‌ها را با try-catch بگیرید، یا باید با throws در امضای متد اعلام کنید.

این Exceptions معمولاً برای خطاهای قابل پیش‌بینی و بازیابی‌پذیر استفاده می‌شوند.


🔎 مثال:
import java.io.*;

public class CheckedExample {
    public static void main(String[] args) {
        try {
            FileReader reader = new FileReader("file.txt"); // FileNotFoundException
            reader.read(); // IOException
        } catch (IOException e) {
            System.out.println("خطا: " + e.getMessage());
        }
    }
}

📌 در این مثال، جاوا ما را مجبور می‌کند که IOException را مدیریت کنیم.



📌 Unchecked Exceptions

در واقع Unchecked Exception ها زیرکلاس‌های RuntimeException هستند.

کامپایلر ما را مجبور به مدیریت آن‌ها نمی‌کند.

این Exceptions معمولاً برای خطاهای برنامه‌نویسی مثل NullPointerException، ArrayIndexOutOfBoundsException یا IllegalArgumentException استفاده می‌شوند.


🔎 مثال:
public class UncheckedExample {
    public static void main(String[] args) {
        String text = null;
        System.out.println(text.length()); // NullPointerException
    }
}

📌 در اینجا هیچ اجباری از طرف کامپایلر برای مدیریت خطا وجود ندارد.




🎯 چرا این تمایز وجود دارد؟

در واقع Checked Exceptions به ما یادآوری می‌کنند که خطاهایی وجود دارند که باید آن‌ها را جدی بگیریم (مثل IO یا دسترسی به شبکه).

و Unchecked Exceptions برای خطاهایی هستند که ناشی از اشتباه برنامه‌نویس‌اند و معمولاً نباید recover شوند (مثل استفاده از null).




تاثیر روی طراحی APIها

اگر API شما با منابع خارجی (فایل، شبکه، دیتابیس) سروکار دارد → بهتر است Checked Exception برگرداند.

اگر API شما ورودی نامعتبر یا خطای منطقی دارد → معمولاً Unchecked Exception بهتر است.


🔎 مثال طراحی API:
// Checked Exception: نشان می‌دهد که خطا قابل انتظار است
public void readFile(String path) throws IOException {
    // ...
}

// Unchecked Exception: نشان می‌دهد که خطا ناشی از ورودی اشتباه است
public void setAge(int age) {
    if (age < 0) {
        throw new IllegalArgumentException("سن نمی‌تواند منفی باشد");
    }
}



جمع‌بندی

Checked Exceptions →
قابل پیش‌بینی، باید مدیریت شوند.

Unchecked Exceptions →
خطاهای برنامه‌نویسی، اجباری برای مدیریت ندارند.

این تمایز باعث می‌شود APIها شفاف‌تر باشند و توسعه‌دهنده بداند کجا باید به خطا اهمیت دهد.

#کاربرـحرفهـای


🆔 @javapro_ir
🆔 @group_javapro
👍51
Spring Boot and Microservices.pdf
594.2 KB
Spring Boot و Microservices

این فایل پی دی اف درباره Spring Boot و معماری مایکروسرویس‌ها هست. به طور خلاصه محتوای اون شامل موارد زیره:

اهمیت ساخت سیستم‌های سریع، مقیاس‌پذیر و چابک در دنیای امروز.

معرفی Spring Boot به‌عنوان یکی از بهترین و ساده‌ترین پلتفرم‌ها برای پیاده‌سازی مایکروسرویس‌ها.

توضیح اصول کلیدی معماری مایکروسرویس مثل:

استقلال سرویس‌ها (خرابی یک سرویس روی بقیه تأثیر نذاره).

استقلال نسخه‌ها (هر سرویس با نسخه خودش کار کنه).

اختصاص دامین مشخص برای هر سرویس (مثلاً سرویس کاربر فقط مدیریت کاربران رو انجام بده).

انتخاب تکنولوژی مناسب برای هر سرویس بر اساس نیازش.

جداسازی کانتینر و دیتابیس برای هر سرویس.

داشتن فرآیند CI/CD مستقل برای هر سرویس.

رعایت قوانین ارتباط بین سرویس‌ها و پروتکل‌های مشخص.

مدیریت لاگ، امنیت و کنترل دسترسی برای هر سرویس به‌طور مستقل.

در پایان هم یک نمونه پروژه e-commerce microservices در گیت‌هاب معرفی شده تا خواننده بتونه عملی‌تر موضوع رو ببینه.

➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🧾شرایط اقساطی دوره جامع نخبگان معماری میکروسرویس ها با Java و boot Spring برای مدت محدود در لینک زیر می توانید مشاهده کنید:

🖥 مشاهده
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 چطور در برنامه‌نویسی انگیزه‌مون رو حفظ کنیم؟

گاهی پیش میاد وسط مسیر یادگیری یا کار کدنویسی بی‌انگیزه بشیم. اما راهکارهایی وجود داره که کمک می‌کنه انگیزه‌مون پایدار بمونه:

1️⃣ با افراد هم‌فکر معاشرت کن → وقتی اطرافت پر از کسایی باشه که روی پروژه‌ها کار می‌کنن، تو هم ناخودآگاه وارد جریان می‌شی.

2️⃣ در رویدادها شرکت کن → دیدار با برنامه‌نویس‌ها، استارتاپی‌ها و متخصصان، انرژی و انگیزه زیادی می‌ده.

3️⃣ استراحت رو فراموش نکن → کدنویسی بدون وقفه باعث فرسودگی می‌شه. با استراحت ذهن تازه می‌مونه.

4️⃣ رقابت کن → شرکت در چالش‌ها و هکاتون‌ها باعث رشد و یادگیری سریع‌تر می‌شه، حتی اگر برنده نشی.

5️⃣ آموزش بده → ضبط ویدئو یا نوشتن مقاله، علاوه بر یادگیری عمیق‌تر، باعث می‌شه دنبال‌کننده پیدا کنی و انگیزه‌ات بیشتر بشه.

6️⃣ چیزهای جدید یاد بگیر → با امتحان تکنولوژی‌ها و روش‌های تازه، یادگیری همیشه جذاب و تازه می‌مونه.

انگیزه در برنامه‌نویسی یک مسیر بلندمدته، با این عادت‌ها می‌تونی پایدار و با انرژی پیش بری.


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🔜بزودی در بروزرسانی جدید دوره طلایی Spring Core مباحث پیشرفته ارائه خواهد شد.
این مباحث برای شرکت کنندگان قبلی دوره «رایگان» خواهد بود.

🖥مشاهده
Please open Telegram to view this post
VIEW IN TELEGRAM
4
⚖️ چرا باید 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
🆕 دوره Spring Core بروزرسانی شد!

مباحث پیشرفته تر به دوره Spring Core اضاف شد

🆓 مباحث جدید اضاف شده برای شرکت کنندکان قبلی دوره رایگان خواهد بود.

👇 مشاهده


➡️اشتراک 👍لایک 💬کامنت

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2025/10/15 12:59:41
Back to Top
HTML Embed Code: