StringBuilder class in Java | کلاس استرینگ بیلدر در جاوا
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
-
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دارد.
