Telegram Web
🌟 قرارداد کامل equals و hashCode در جاوا


متد equals و hashCode دو بخش جدایی‌ناپذیر از قرارداد برابری در جاوا هستند. زمانی‌که شما این متدها را بازنویسی می‌کنید، باید قوانین مشخصی را رعایت کنید تا رفتار کلاس‌هایتان قابل پیش‌بینی و درست باقی بماند. این قوانین به صورت رسمی در مستندات جاوا تعریف شده‌اند.


قوانین متد equals:

۱️⃣ بازتابی بودن (Reflexive): هر شیء باید با خودش برابر باشد.

obj.equals(obj) // همیشه باید true باشد


۲️⃣ متقارن بودن (Symmetric): اگر a.equals(b) درست باشد، باید b.equals(a) هم درست باشد.

a.equals(b) == b.equals(a)


۳️⃣ گذرا بودن (Transitive): اگر a.equals(b) و b.equals(c) درست باشند، آنگاه a.equals(c) نیز باید درست باشد.

if(a.equals(b) && b.equals(c)) {
    a.equals(c) == true;
}


۴️⃣ سازگاری (Consistent): نتایج مقایسه باید در صورت تغییر نکردن وضعیت اشیاء ثابت بماند.

a.equals(b) // همیشه همان نتیجه را برمی‌گرداند تا وقتی که وضعیت a و b تغییر نکند


۵️⃣ عدم برابری با null: هیچ شیء نباید برابر با null باشد.

a.equals(null) // همیشه false



قوانین متد hashCode:

۱️⃣ سازگاری با equals: اگر دو شیء برابر باشند (equals آنها true باشد)، مقدار hashCode آن‌ها باید یکی باشد.

۲️⃣ سازگاری زمانی: تا زمانی که وضعیت شیء تغییر نکرده باشد، مقدار hashCode آن باید ثابت بماند.

۳️⃣ نامساوی‌ها ممکن است یکسان باشند: اگر دو شیء برابر نباشند، مجاز است که hashCode یکسانی داشته باشند، ولی توصیه می‌شود که تا جای ممکن متفاوت باشند.


مثال عملی:

import java.util.Objects;

class Person {
    private String name;
    private 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);
    }
}


در این مثال، اگر دو شیء از نوع Person دارای نام و سن یکسان باشند، هم equals و هم hashCode آن‌ها برابر خواهد بود. این امر باعث می‌شود در ساختارهایی مثل HashSet یا HashMap رفتار درستی داشته باشند.


نتیجه‌گیری:
رعایت قرارداد equals و hashCode برای جلوگیری از خطاهای غیرمنتظره در مجموعه‌هایی مثل HashSet، HashMap و دیگر ساختارهای داده وابسته به هش بسیار حیاتی است. بی‌توجهی به این قوانین می‌تواند منجر به خطاهایی شود که پیدا کردن آن‌ها بسیار دشوار است.

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


🆔 @javapro_ir
🆔 @group_javapro
👍31
🚀 استخدام برنامه‌نویس جاوا در شرکت داده‌ورزی سداد 💼

شرکت داده‌ورزی سداد به منظور توسعه تیم‌های فنی خود، در حال جذب متخصصین با مهارت‌های زیر می‌باشد:

🔹 مسلط به Java (نسخه 8 به بالا)
🔹 آشنایی با Spring Framework
🔹 تسلط بر مفاهیم OOP
🔹 تجربه کار با JPA / Hibernate
🔹 تجربه توسعه RESTful API
🔹 توانایی کار با پایگاه داده‌های PostgreSQL یا DB2
🔹 آشنایی با ابزار Maven
🔹 توانایی کار با Git و Git-based workflow

📧 برای ارسال رزومه
در صورت تمایل به همکاری، رزومه خود را به آدرس پست الکترونیک زیر ارسال فرمایید:
✉️ [email protected]


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

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
📌 مفهوم Pass by Value در جاوا

در جاوا همه‌ی پارامترها به‌صورت Pass by Value (یعنی ارسال مقدار) به متدها منتقل می‌شوند.
اما بسیاری از برنامه‌نویسان در ابتدا فکر می‌کنند جاوا Pass by Reference دارد، چون وقتی یک آبجکت به متد ارسال می‌شود، تغییر روی آن آبجکت در بیرون متد هم دیده می‌شود.

🔎 بیایید دقیق‌تر نگاه کنیم:

اگر نوع‌های ابتدایی (Primitive) مثل int, double, boolean را ارسال کنید، مقدار کپی می‌شود. پس تغییرات داخل متد روی متغیر اصلی اثری ندارد.

اگر آبجکت را ارسال کنید، در واقع کپی آدرس آبجکت (Reference Value) ارسال می‌شود. بنابراین متد می‌تواند به همان آبجکت اشاره کرده و داده‌هایش را تغییر دهد. اما خود رفرنس اصلی کپی شده و تغییرش بی‌اثر است.



📘 مثال ۱ – نوع Primitive:

public class PassByValueDemo {
    public static void main(String[] args) {
        int x = 10;
        changeValue(x);
        System.out.println("x after method: " + x); // خروجی: 10
    }

    static void changeValue(int num) {
        num = 20; // فقط کپی تغییر می‌کند
    }
}

👉 نتیجه: مقدار x تغییر نکرد چون فقط کپی به متد داده شده بود.


📘 مثال ۲ – آبجکت‌ها:

class Person {
    String name;
}

public class PassByValueDemo2 {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "Ali";
        changeName(p);
        System.out.println("Person name: " + p.name); // خروجی: Reza
    }

    static void changeName(Person person) {
        person.name = "Reza"; // داده‌ی داخل آبجکت تغییر می‌کند
    }
}

👉 اینجا رشته‌ی name تغییر کرد، چون رفرنس کپی شده به همان آبجکت اشاره داشت.



📘 مثال ۳ – تغییر رفرنس داخل متد:
static void reassignObject(Person person) {
    person = new Person();
    person.name = "Sara";
}

public static void main(String[] args) {
    Person p = new Person();
    p.name = "Ali";
    reassignObject(p);
    System.out.println(p.name); // خروجی: Ali
}

👉 در اینجا مقدار name تغییر نکرد چون رفرنس اصلی کپی شده بود و تغییر رفرنس داخل متد روی متغیر اصلی بی‌اثر است.



نتیجه‌گیری:
جاوا همیشه Pass by Value است، حتی برای آبجکت‌ها. فقط نکته این است که وقتی آبجکت‌ها را پاس می‌دهید، در واقع کپی رفرنس پاس می‌شود، نه خود آبجکت. همین موضوع باعث سردرگمی خیلی‌ها می‌شود.

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


🆔 @javapro_ir
🆔 @group_javapro
👍71
📌موضوع: Immutable Objects در جاوا و ارتباط آن با Pass by Value

در جاوا بعضی از کلاس‌ها Immutable هستند؛ یعنی بعد از ساخته شدن، حالت داخلی آن‌ها دیگر تغییر نمی‌کند.
معروف‌ترین نمونه‌ی Immutable در جاوا، کلاس String است.

🔎 ویژگی اصلی Immutable این است که اگر به نظر برسد در حال تغییر دادن شیء هستیم، در واقع یک شیء جدید ساخته می‌شود و رفرنس متغیر به آن اشاره می‌کند.


📘 مثال ۱ – رشته‌ها (String):

public class ImmutableDemo {
    public static void main(String[] args) {
        String s = "Ali";
        changeString(s);
        System.out.println("Original: " + s); // خروجی: Ali
    }

    static void changeString(String str) {
        str = str + " Reza"; // شیء جدید ساخته می‌شود
        System.out.println("Inside method: " + str); // خروجی: Ali Reza
    }
}


👉 چرا خروجی نهایی هنوز Ali است؟
چون شیء رشته تغییر نکرد، بلکه یک String جدید ساخته شد و فقط رفرنس محلی (str) در متد به آن اشاره کرد.


📘 مثال ۲ – مقایسه با Mutable Object (مثل StringBuilder):

public class MutableDemo {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Ali");
        changeBuilder(sb);
        System.out.println("After method: " + sb); // خروجی: Ali Reza
    }

    static void changeBuilder(StringBuilder builder) {
        builder.append(" Reza"); // همان شیء تغییر می‌کند
    }
}


👉 این بار شیء تغییر کرد، چون StringBuilder یک کلاس Mutable است.


نتیجه‌گیری:

* جاوا همیشه Pass by Value است، اما رفتار Immutable vs Mutable تعیین می‌کند که داده‌ها "به ظاهر" تغییر می‌کنند یا نه.
* در مورد Immutableها مثل String، هر تغییری منجر به ساخت یک شیء جدید می‌شود.
* در مورد Mutableها مثل StringBuilder یا ArrayList، تغییرات مستقیماً روی همان شیء اثر می‌گذارد.

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



🆔 @javapro_ir
🆔 @group_javapro
👍51🗿1
📌 موضوع: String Pool در جاوا و تفاوت == با equals

در جاوا رشته‌ها (`String`) یک ویژگی خاص دارند به نام String Pool. این مکانیزم باعث می‌شود مدیریت حافظه بهینه‌تر شود.


🔎 String Pool چیست؟
وقتی شما یک رشته با لیترال (Literal) بسازید، جاوا آن را در یک حافظه‌ی خاص به نام String Pool نگه می‌دارد. اگر دوباره همان رشته را با همان مقدار بسازید، جاوا از همان شیء موجود در String Pool استفاده می‌کند.


📘 مثال ۱ – استفاده از String Pool:


public class StringPoolDemo {
public static void main(String[] args) {
String s1 = "Ali";
String s2 = "Ali";

System.out.println(s1 == s2); // true
System.out.println(s1.equals(s2)); // true
}
}


👉 چرا == اینجا true شد؟
چون هر دو متغیر به یک شیء یکسان در String Pool اشاره می‌کنند.


📘 مثال ۲ – استفاده از new String():


public class StringPoolDemo2 {
public static void main(String[] args) {
String s1 = new String("Ali");
String s2 = new String("Ali");

System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
}
}


👉 این بار == false شد، چون هر بار که از new String() استفاده می‌کنیم، یک شیء جدید در حافظه Heap ساخته می‌شود (نه در String Pool).
اما equals() مقدار محتوای رشته را مقایسه می‌کند، بنابراین true می‌دهد.


📘 مثال ۳ – متد intern():


public class StringPoolDemo3 {
public static void main(String[] args) {
String s1 = new String("Ali");
String s2 = s1.intern(); // این رشته وارد String Pool می‌شود
String s3 = "Ali";

System.out.println(s2 == s3); // true
}
}


👉 متد intern() باعث می‌شود رشته وارد String Pool شود و از آن به بعد مقایسه با == هم true خواهد شد.


نتیجه‌گیری:

* همیشه از equals() برای مقایسه‌ی مقدار رشته‌ها استفاده کنید.
* == فقط بررسی می‌کند که دو متغیر به یک شیء یکسان در حافظه اشاره می‌کنند.
* بهینه‌سازی حافظه در جاوا برای رشته‌ها به کمک String Pool انجام می‌شود.

#کاربر_مبتدی


🆔 @javapro_ir
🆔 @group_javapro
5👍5
💻دوره جامع نخبگان معماری میکروسرویس ها با Java و Spring Boot بروزرسانی شد

فصل ۱۹ به دوره اضاف شد
📅تاریخ آخرین بروزرسانی:  ۱۴ مهر  ۱۴٠۴

🔺مشاهده
Please open Telegram to view this post
VIEW IN TELEGRAM
راه حلی برای اجرا کردن برنامه های روزانه ات

اگر میخوای آموزش ببینی، کتاب بخونی، ورزش کنی و... ولی اهمال کاری میکنی این راه حل مناسب شماست.

بخش اول

🆔 @javapro_ir
🆔 @group_javapro
👍4
راه حلی برای اجرا کردن برنامه های روزانه ات

بخش دوم (پایانی)

🆔 @javapro_ir
🆔 @group_javapro
👍3
🎆 ۱۶ مهر؛ تولد ۹ سالگی جاواپرو 9️⃣🎂

جاواپرو در ۱۶ مهر ۱۳۹۵ ساعت ۱۷:۳۷ متولد شد

۹ سال تلاش، یادگیری و رشدِ پیوسته برای ساختن دنیایی که منابع فارسی آموزش جاوا در اون غنی‌تر، کاربردی‌تر و در دسترس‌تر باشن.

با هم یاد می‌گیریم، با هم پیشرفت می‌کنیم و با هم مسیر جاوا در ایران رو روشن‌تر می‌سازیم. 🇮🇷💕🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
10🎉3
📢فصل 19 دوره جامع نخبگان میکروسرویس به دلیل انجام اصلاحات حذف شده است و پس از تکمیل اصلاحات، مجدداً در فهرست سرفصل‌ها قرار خواهد گرفت.لذا عزیزانی که سرفصل 19 را دانلود کردن آن را حذف کنند و مجدد بعد از اطلاع رسانی از سایت دانلود نمایند.

آکادمی جاواپرو
Please open Telegram to view this post
VIEW IN TELEGRAM
میدونی ماتریس SWOT چیه؟
Anonymous Poll
23%
بله
77%
خیر
2
🟥 ماتریس SWOT چیست؟

🔹 ماتریس SWOT (تلفظ: اس‌وُت) یک ابزار تحلیلی است که برای بررسی وضعیت یک موضوع، کسب‌وکار، مهارت یا حتی تصمیم شخصی استفاده می‌شود.
کلمه‌ی SWOT مخفف چهار واژه انگلیسی است:

S – Strengths نقاط قوت ویژگی‌های مثبت، مزیت‌ها یا چیزهایی که باعث برتری شما یا موضوع مورد نظر می‌شوند.
W – Weaknesses نقاط ضعف محدودیت‌ها، کمبودها یا مشکلاتی که باعث عقب‌ماندگی یا کاهش کارایی می‌شوند.
O – Opportunities فرصت‌ها شرایط بیرونی یا روندهایی که می‌توانند باعث رشد، موفقیت یا پیشرفت شوند.
T – Threats تهدیدها خطرات یا عوامل بیرونی که می‌توانند مانع پیشرفت یا باعث شکست شوند.

🔹 شکل ماتریس SWOT

معمولاً به صورت یک جدول چهارخانه نمایش داده می‌شود:

مثبت (درونی / بیرونی) منفی (درونی / بیرونی)

درونی (قابل کنترل) ⬅️نقاط قوت (S) نقاط ضعف (W)
بیرونی (غیرقابل کنترل) ⬅️فرصت‌ها (O) تهدیدها (T)

🔹 کاربرد SWOT چیه؟

از SWOT برای تحلیل تصمیم‌ها و برنامه‌ریزی استراتژیک استفاده می‌کنیم.
مثلاً می‌خوای بدونی:

آیا یادگیری زبان جاوا برایت تصمیم درستی است یا نه؟

یا اینکه آیا سرمایه‌گذاری روی یک کسب‌وکار جدید به‌صرفه است یا خطرناک؟


در این حالت، با نوشتن نقاط قوت، ضعف، فرصت و تهدید، تصویری واقعی از وضعیت به‌دست می‌آوری تا بتوانی تصمیم آگاهانه‌تری بگیری.


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

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
7🙏3😍3
مثلا میخواید یک زبان برنامه نویسی جدید رو شروع کنید یک ماتریس شبیه چیزی که در تصویر هست میکشید و در بخش S نقاط قوت اون زبان برنامه نویسی و در بخش W نقاط ضعف اون زبان برنامه نویسی و در بخش O فرصت های اون زبان برنامه نویسی و در بخش T تهدید های اون زبان رو می نویسید اینجوری یک دید بهتری میگیرید که اصلا ارزش داره اون زبان برنامه نوییی را یاد بگیرید یا خیر

در بخش S و W به عوامل درونی اشاره داره و بخش O و T به عوامل بیرونی اشاره داره در ادامه یک مثال از ماتریس SWOT زبان برنامه نویسی جاوا براتون میزنم و برای تمرین بیشتر از هوش مصنوعی می تونید کمک بگیرید، سرچ کنید و تمرینات بیشتری انجام بدید که حسابی دست تون بیاد.

ماتریس SWOT در شروع یک مهارت جدید، راه اندازی کسب و کار، حتی ازدواج و.... میتونه بهتون کمک کنه و با دید باز تصمیم بگیرید.


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

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
6💯3
نمونه مثال تحلیل SWOT برای یادگیری و کار با برنامه نویسی جاوا توسط هوش مصنوعی


🏋️‍♀️نقاط قوت (Strengths):
۱. پایداری و بلوغ جاوا یک زبان قدیمی و بالغ است و طی سال‌ها توسعه‌ یافته و خطاهای اصلی آن رفع شده است. به همین دلیل در پروژه‌های بزرگ سازمانی اعتماد بالایی دارد.
۲. جامعه بزرگ و اکوسیستم غنی کتابخانه‌ها، فریم‌ورک‌ها و ابزارهای فراوان (Spring, Hibernate, Jakarta EE، ابزارهای تست، ابزارهای توسعه و …) در اطراف جاوا وجود دارد که به شما اجازه می‌دهد تقریباً برای هر نیاز راه‌حلی پیدا کنید.
۳. قابلیت اجرا در پلتفرم‌های مختلف (Write Once, Run Anywhere) با JVM، کد جاوا می‌تواند روی پلتفرم‌های مختلف اجرا شود (ویندوز، لینوکس، مک) با کمترین تغییر.
۴. استفاده گسترده در سطح سازمانی / بانکی / مالی بسیاری از بانک‌ها، شرکت‌های بزرگ، سیستم‌های سازمانی و دولتی از جاوا برای بخش‌های بک‌اند استفاده می‌کنند. این می‌تواند ثبات شغلی را افزایش دهد.
۵. تقاضای مداوم در بازار جهانی طبق گزارش‌ها، جاوا همچنان یکی از زبان‌های برتر بازار است و در پروژه‌های کلان سازمانی، کلود، میکروسرویس‌ها جایگاه خوبی دارد.
۶. بازار جهانی و امکان کار از راه دور شما می‌توانید برای شرکت‌های خارجی کار کنید و درآمد ارزی داشته باشید، با استفاده از فریلنسینگ یا استخدام ریموت. در ایران نیز موقعیت‌های ریموت برای جاوا وجود دارد.

📺نقاط ضعف (Weaknesses):
۱. آغاز سخت برای مبتدی‌ها مفاهیمی مانند مدیریت حافظه (گرابج کالکشن)، چندنخی (multithreading)، JVM tuning و ساختار فریم‌ورک‌ها ممکن است برای تازه‌کار زیاد پیچیده باشد.
۲. رقابت با زبان‌های مدرن‌تر و فریم‌ورک‌های جدید زبان‌هایی مانند Python، JavaScript/TypeScript، Go، Kotlin و فریم‌ورک‌هایی سبک‌تر ممکن است برای پروژه‌های جدید انتخاب شوند.
۳. به‌روزرسانی‌های نسخه‌ای و مهاجرت تغییر نسخه جاوا (مثلاً جاوا 8 → 11 → 17 → 21) ممکن است چالش‌هایی ایجاد کند؛ پروژه‌ها باید به‌روزرسانی شوند و ناسازگاری ممکن است پیش بیاید.
۴. مصرف حافظه و زمان راه‌اندازی در مقایسه با زبان‌های کامپایل‌شده به صورت بومی (native) و زبان‌ها سبک مثل Go یا Rust، جاوا بعضی مواقع زمان راه‌اندازی بیشتری دارد و مصرف منابع بیشتری دارد.

🚀فرصت‌ها (Opportunities):
۱. رشد بازار نرم‌افزار و دیجیتال‌سازی در ایران و جهان با دیجیتال‌شدن سازمان‌ها، نیاز به توسعه سیستم‌های پشتیبان، APIها، مدیریت داده و خدمات بک‌اند افزایش می‌یابد. بازار جهانی جاوا طبق پیش‌بینی‌ها رشد خواهد داشت.
۲. تکنولوژی‌های جدید و ترکیب با جاوا استفاده از میکروسرویس، معماری ابری (cloud-native)، سرورلس، پروژه لام، GraalVM، جاوا در هوش مصنوعی و داده‌های بزرگ (big data).
۳. کار ریموت و پروژه‌های بین‌المللی به ویژه برای کسانی که در ایران هستند، کار برای شرکت‌های خارجی یا پروژه‌های بین‌المللی می‌تواند درآمد بسیار بالاتری نسبت به بازار داخلی داشته باشد.
۴. تخصص و مهارت‌های جانبی اگر در جاوا علاوه بر زبان، فریم‌ورک‌های مهم (مثلاً Spring Boot، میکروسرویس‌ها، Kafka، ابزارهای ابری) را خوب یاد بگیرید، شما را در بازار برجسته‌تر می‌کند.
۵. بازار ایران هنوز در حال تکامل در ایران هنوز بسیاری از کسب‌وکارها به سمت سیستم‎‌سازی و اتوماسیون حرکت نکرده‌اند و این یعنی فرصت برای کسانی که با جاوا وارد شوند.

🔫تهدیدها (Threats) :
۱. نوسان اقتصادی و مسائل ارزی در ایران حتی اگر درآمد دلاری داشته باشید، مشکلات انتقال پول، محدودیت‌ها و تغییرات ارزی می‌تواند تأثیر مهمی داشته باشد.
۲. رقابت شدید و اشباع شدن بازار چون جاوا یکی از زبان‌های محبوب است، رقابت زیاد است؛ برای جذب پروژه یا استخدام، باید توانمندی‌های قوی و رزومه خوب داشته باشید.
۳. مهاجرت نیروی انسانی (فرار مغزها) اگر بسیاری از متخصصان موفق به خروج از کشور شوند، دسترسی به مربیان و شبکه محلی ممکن است کاهش یابد و بازار داخلی ضعیف‌تر شود.
۴. ظهور زبان‌ها و فناوری‌های نو زبان‌ها و فناوری‌های تازه مانند Rust، Kotlin، Node.js، پلتفرم‌های سرورلس ممکن است بخشی از سهم بازار را بگیرند.
۵. چالش‌های مدیریتی و پروژه‌های بزرگ در پروژه‌های بزرگ، مسائل هماهنگی، پاسخ‌گویی، نگهداری و مدیریت معماری ممکن است باعث عقب‌ماندگی یا شکست پروژه شوند.

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

⚡️ @javapro_ir
✈️@group_javapro
Please open Telegram to view this post
VIEW IN TELEGRAM
👍196
اگر از این نوع محتواها را میپسندید، لایک کنید تا متوجه بشیم و بازخورد بگیریم.👍
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📘 موضوع : StringBuilder vs StringBuffer — تفاوت در عملکرد و Thread-Safety

در جاوا، وقتی بخواهیم رشته‌ها را به صورت قابل‌تغییر (Mutable) مدیریت کنیم، به جای استفاده از String از StringBuilder یا StringBuffer استفاده می‌کنیم.
اما تفاوت اصلی این دو در نخ‌ ایمنی (Thread Safety) و کارایی (Performance) است.


🔹 ۱. StringBuffer — ایمن در برابر چند نخ (Thread-Safe):
کلاس StringBuffer از نسخه‌های اولیه‌ی جاوا وجود دارد و همه‌ی متدهای آن synchronized هستند.
یعنی فقط یک Thread در هر لحظه می‌تواند به آن دسترسی داشته باشد.

مناسب برای برنامه‌هایی که چند Thread هم‌زمان روی یک رشته کار می‌کنند.
ولی کندتر از StringBuilder است، چون همواره باید قفل (lock) برقرار شود.

📘 مثال:


public class BufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" Java");
sb.append(" World!");
System.out.println(sb); // Hello Java World!
}
}


در محیط‌های چند‌نخی (multi-threaded)، این روش امن است چون StringBuffer از قفل استفاده می‌کند تا داده خراب نشود.


🔹 ۲. StringBuilder — سریع‌تر اما غیرایمن (Not Thread-Safe):
کلاس StringBuilder در جاوا 5 معرفی شد تا جایگزینی سریع‌تر برای StringBuffer باشد.
متدهای آن synchronized نیستند، پس در محیط تک‌نخی (Single Thread) عملکرد بهتری دارد.

بسیار سریع‌تر از StringBuffer است.
در محیط چند‌نخی نباید هم‌زمان از چند Thread به آن دسترسی داشت.

📘 مثال:


public class BuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" Java");
sb.append(" World!");
System.out.println(sb); // Hello Java World!
}
}


در برنامه‌های ساده یا الگوریتم‌هایی مثل ساخت رشته در حلقه‌ها (`for`)، همیشه StringBuilder انتخاب بهتری است.


🔹 ۳. تفاوت در سرعت:
در محیط تک‌نخی، StringBuilder معمولاً ۳۰ تا ۴۰ درصد سریع‌تر از StringBuffer است، چون از هیچ قفلی استفاده نمی‌کند.

📘 مثال مقایسه عملکرد:


public class PerformanceTest {
public static void main(String[] args) {
long start1 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100000; i++) sb.append("A");
System.out.println("StringBuilder: " + (System.nanoTime() - start1));

long start2 = System.nanoTime();
StringBuffer sbf = new StringBuffer();
for(int i = 0; i < 100000; i++) sbf.append("A");
System.out.println("StringBuffer: " + (System.nanoTime() - start2));
}
}


در بیشتر موارد، StringBuilder سریع‌تر اجرا می‌شود.


جمع‌بندی نهایی:

* اگر برنامه‌ی شما تک‌نخی (Single-threaded) است ➤ از StringBuilder استفاده کن.
* اگر برنامه‌ی شما چندنخی (Multi-threaded) است ➤ از StringBuffer استفاده کن.
* هر دو Mutable هستند و برای کارهای زیاد با رشته‌ها مناسب‌تر از String هستند.


🔥 نکته مهم:
در واقع String در جاوا Immutable است، اما StringBuilder و StringBuffer Mutable هستند؛ بنابراین استفاده‌ی درست از آن‌ها در جاهایی که رشته‌ها زیاد تغییر می‌کنند باعث افزایش چشمگیر کارایی برنامه می‌شود.

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


🆔 @javapro_ir
🆔 @group_javapro
👍6
💻دوره جامع نخبگان معماری میکروسرویس ها با Java و Spring Boot بروزرسانی شد

فصل های ۱۹ و ۲٠ به دوره اضاف شد
📅تاریخ آخرین بروزرسانی:  ۱۹ مهر  ۱۴٠۴

🔺مشاهده
Please open Telegram to view this post
VIEW IN TELEGRAM
📘 تفاوت StringBuilder با String.concat() و دلیل پرهیز از استفاده‌ی + در حلقه‌ها

در جاوا، رشته‌ها (`String`) Immutable (تغییرناپذیر) هستند؛ یعنی هر بار که یک عملیات ترکیب (`+` یا `concat`) انجام می‌دهی، یک شیء جدید از نوع String ساخته می‌شود و مقدار قبلی در حافظه باقی می‌ماند.

به همین خاطر، اگر در حلقه از + یا concat() استفاده کنی، در واقع در هر بار تکرار، شیء جدیدی در حافظه ایجاد می‌شود که باعث کاهش شدید Performance و افزایش مصرف حافظه می‌گردد.


🔹 ۱. مشکل استفاده از + در حلقه‌ها

📘 مثال:


public class StringConcatExample {
public static void main(String[] args) {
String result = "";
for (int i = 0; i < 5; i++) {
result = result + i;
}
System.out.println(result);
}
}


🔍 در ظاهر، خروجی ساده است:


01234


اما در پشت صحنه، در هر بار اجرای خط result = result + i;
یک StringBuilder موقت ساخته می‌شود، مقدار قبلی و جدید را به هم می‌چسباند، سپس به String تبدیل می‌شود و در نهایت شیء قبلی از بین می‌رود.

یعنی برای پنج بار تکرار، حداقل پنج شیء String و پنج شیء StringBuilder ساخته می‌شود!
در حلقه‌های بزرگ (مثلاً هزار بار)، این کار بسیار پرهزینه می‌شود.


🔹 ۲. استفاده از String.concat()

روش دیگر، استفاده از متد concat() است:


public class ConcatExample {
public static void main(String[] args) {
String result = "";
for (int i = 0; i < 5; i++) {
result = result.concat(String.valueOf(i));
}
System.out.println(result);
}
}


این هم دقیقاً همان مشکل را دارد؛ چون متد concat() هم رشته‌ی جدیدی می‌سازد.
در واقع، concat() درون خودش چیزی شبیه این انجام می‌دهد:


return new String(this.value + otherValue);


یعنی هیچ فرقی از نظر Immutable بودن با + ندارد.


🔹 ۳. راه‌حل صحیح: استفاده از StringBuilder

برای جلوگیری از ساخت رشته‌های متعدد، از StringBuilder استفاده می‌کنیم که Mutable است و مستقیماً روی همان آبجکت کار می‌کند.

📘 مثال بهینه:


public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append(i);
}
System.out.println(sb.toString());
}
}


در اینجا فقط یک شیء StringBuilder در حافظه ساخته می‌شود و متد append() در هر بار تکرار به همان شیء اضافه می‌کند.
در پایان با toString() آن را به String تبدیل می‌کنیم.


🔹 ۴. مقایسه‌ی عملکرد

📘 مثال:


public class PerformanceTest {
public static void main(String[] args) {
long start1 = System.nanoTime();
String s = "";
for (int i = 0; i < 10000; i++) {
s += i;
}
long duration1 = System.nanoTime() - start1;

long start2 = System.nanoTime();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
long duration2 = System.nanoTime() - start2;

System.out.println("Using '+': " + duration1);
System.out.println("Using StringBuilder: " + duration2);
}
}


🔍 در بیشتر سیستم‌ها، تفاوت زمان می‌تواند ده‌ها برابر باشد.
استفاده از StringBuilder در حلقه‌ها معمولاً ۱۰ تا ۲۰ برابر سریع‌تر است.


🔥 نکته‌ی پایانی:
کامپایلر جاوا در صورت استفاده از + خارج از حلقه‌ها، خودش آن را به StringBuilder تبدیل می‌کند.
اما در داخل حلقه‌ها، این کار را انجام نمی‌دهد، چون هر بار باید مقدار جدید بسازد.

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


🆔 @javapro_ir
🆔 @group_javapro
👍2
2025/10/13 02:07:41
Back to Top
HTML Embed Code: