Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

StringBuilder class in Java | کلاس استرینگ بیلدر در جاوا

📖توضیحات درس

🎥 این ویدیو قسمت بیست و نهم از بوت‌کمپ رایگان جاواست. 🧩 کلاس StringBuilder در جاوا – معرفی و مقایسه با String 📝 در این قسمت به یکی از کلاس‌های کاربردی در جاوا می‌پردازیم: StringBuilder 💡 با هم یاد می‌گیریم که StringBuilder چیست چه کاربردهایی دارد و چرا در بعضی شرایط بهتر است به جای String از آن استفاده کنیم. ⚙️ در ادامه بررسی می‌کنیم: • تفاوت String و StringBuilder در نحوه مدیریت حافظه • تاثیر تغییرناپذیر بودن String بر عملکرد برنامه • چرا StringBuilder در عملیات‌های زیاد روی رشته‌ها عملکرد بهتری دارد 🔍 همچنین یک مقایسه دقیق از نظر کارایی (Performance انجام می‌دهیم تا مشخص شود هر کدام در چه سناریوهایی انتخاب مناسب‌تری هستند. ✅ در پایان جلسه نیز نکات مهم را مرور می‌کنیم تا بتوانی در پروژه‌های واقعی بهترین انتخاب بین String و StringBuilder را داشته باشی. 👥 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi ❓ هر سوالی داشتی می‌تونی در گروه بپرسی؛ من یا مربی‌های گروه کمکت می‌کنیم. 🚀 بوت‌کمپ رایگان جاوا – آموزش پروژه‌محور برای یادگیری عمیق و ورود به بازار کار.
00:20:13🎯رایگان

📄جزوه

مفاهیم کلیدی

  • Immutable
    به اشیایی گفته می‌شود که پس از ایجاد در حافظه، غیرقابل تغییر هستند. در جاوا، کلاس String به صورت Immutable طراحی شده است؛ یعنی هر تغییری در آن منجر به ایجاد یک شیء جدید در حافظه می‌شود.

  • Mutable
    به معنای قابل تغییر بودن است. کلاس StringBuilder یک توالی از کاراکترهاست که برخلاف String اجازه می‌دهد محتوای آن بدون ایجاد اشیای جدید در حافظه، اصلاح و دستکاری شود.

  • Garbage Collector (GC)
    بخشی از مدیریت حافظه در جاوا که وظیفه شناسایی و حذف اشیای بلااستفاده را بر عهده دارد. استفاده نادرست از String در حلقه‌های طولانی باعث فشار زیاد به GC و کاهش سرعت برنامه می‌شود.

  • Capacity
    مقدار حافظه‌ای که برای یک StringBuilder رزرو می‌شود. به طور پیش‌فرض این مقدار ۱۶ کاراکتر است، اما می‌توان هنگام ساخت شیء، ظرفیت مشخصی برای آن تعیین کرد تا از تغییر سایز مکرر در حافظه جلوگیری شود.

  • Append Method
    متدی در StringBuilder که برای اضافه کردن محتوا به انتهای رشته فعلی استفاده می‌شود. این متد برخلاف عملگر + در رشته‌ها، شیء جدیدی نمی‌سازد.

نکات مهم مصاحبه‌ای

  • تفاوت اصلی String و StringBuilder در چیست؟
    کلاس String غیرقابل تغییر (Immutable) است و هر تغییر در آن باعث ایجاد یک آبجکت جدید و مصرف حافظه می‌شود. اما StringBuilder قابل تغییر (Mutable) است و عملیات را روی همان آبجکت اولیه انجام می‌دهد، که باعث افزایش چشمگیر سرعت می‌شود.

  • چرا در حلقه‌های تکرار (Loops) نباید از String استفاده کرد؟
    چون در هر بار اجرای حلقه، یک آبجکت جدید ساخته شده و آبجکت قبلی رها می‌شود. این کار باعث اشغال سریع حافظه RAM و درگیر شدن شدید CPU برای پاکسازی حافظه توسط Garbage Collector می‌گردد.

  • چه زمانی از StringBuilder استفاده کنیم؟
    زمانی که نیاز به تغییرات مکرر روی یک رشته داریم (مانند خواندن یک فایل سنگین یا ترکیب تعداد زیادی رشته در یک حلقه). اگر رشته ثابت است و تغییری نمی‌کند، استفاده از همان String ترجیح داده می‌شود.

مثال یا سناریوی کاربردی

فرض کنید می‌خواهیم کلمه "Line" را ۱۰ میلیون بار به یک رشته اضافه کنیم.

سناریوی اول با استفاده از String:

String s = "";
for (int i = 0; i < 10000000; i++) {
    s += "Line"; // در هر مرحله یک آبجکت جدید ساخته می‌شود
}

در این حالت، مصرف رم به سرعت بالا می‌رود (مثلاً تا ۷۰۰ مگابایت) و زمان اجرای برنامه بسیار طولانی می‌شود (ممکن است چندین دقیقه طول بکشد) چون سیستم مدام در حال ساخت و حذف اشیاست.

سناریوی دوم با استفاده از StringBuilder:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000000; i++) {
    sb.append("Line"); // تغییر روی همان آبجکت قبلی انجام می‌شود
}

در این حالت، مصرف حافظه بسیار ناچیز است (حدود ۱۲۵ مگابایت برای ذخیره خود داده) و عملیات در کمتر از یک ثانیه به پایان می‌رسد.

بیشتر بدانید

  • نکته IDE: در محیط IntelliJ IDEA، اگر از String در حلقه‌ای استفاده کنید که بازدهی پایینی داشته باشد، خودِ محیط توسعه به شما هشدار می‌دهد و پیشنهاد می‌دهد که آن را به StringBuilder تبدیل کنید.

  • متدهای کاربردی: علاوه بر append، کلاس StringBuilder دارای متدهای مفیدی مثل insert (برای درج در موقعیت خاص)، reverse (برای معکوس کردن رشته) و delete (برای حذف بخشی از رشته) است.

  • کلاس StringBuffer: این کلاس مشابه StringBuilder است با این تفاوت که برای محیط‌های چندنخی (Multi-threading) طراحی شده و ایمن‌تر است (Thread-safe)؛ اما به دلیل این ایمنی، سرعت کمتری نسبت به StringBuilder دارد.