tgoop.com/javapro_ir/4560
Create:
Last Update:
Last Update:
📘 تفاوت 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
BY برنامه نویسی جاوا | Java
Share with your friend now:
tgoop.com/javapro_ir/4560