JAVAPRO_IR Telegram 4560
📘 تفاوت 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
👍3



tgoop.com/javapro_ir/4560
Create:
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

View MORE
Open in Telegram


Telegram News

Date: |

With the “Bear Market Screaming Therapy Group,” we’ve now transcended language. Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day. 1What is Telegram Channels? The initiatives announced by Perekopsky include monitoring the content in groups. According to the executive, posts identified as lacking context or as containing false information will be flagged as a potential source of disinformation. The content is then forwarded to Telegram's fact-checking channels for analysis and subsequent publication of verified information. In the next window, choose the type of your channel. If you want your channel to be public, you need to develop a link for it. In the screenshot below, it’s ”/catmarketing.” If your selected link is unavailable, you’ll need to suggest another option.
from us


Telegram برنامه نویسی جاوا | Java
FROM American