آیا تفاوت در عملکرد بین استفاده از اپراتور "+" و StringBuilder در جاوا وجود دارد؟


پاسخ 1:

آیا تفاوت در عملکرد بین استفاده از اپراتور "+" و StringBuilder در جاوا وجود دارد؟

در یک خط مثل این:

string string1 = "یک" + "دو"؛ string string2 = StringBuilder جدید ("یک"). ضمیمه ("دو"). ToString ()؛

هیچ تفاوتی در عملکرد وجود ندارد. در واقع ، در اکوسیستم های مدرن جاوا ، اولی برای زمان دوم در زمان کامپایل بهینه شده است. برای دیدن این در عمل ، سعی کنید با اشکالزدایی ارجح خود را شروع کنید.

اما اگر رشته ها را در خطوط جداگانه یا مثلاً در حلقه for قرار دهید:

string string1 = ""؛ StringBuilder sb = جدید StringBuilder ()؛ for (Integer i = 0؛ i <5؛ i ++) {string1 = string1 + i.toString ()؛ sb.append (i.toString ())؛ } رشته string2 = sb.toString ()؛

سپس استفاده از StringBuilder "کارآمدتر" است و گاهی اوقات روش ترجیحی برای ایجاد یک رشته پیچیده تر است. تا آنجا که من می دانم ، هیچ کامپایلر جاوا در حال حاضر بهینه سازی تکرار + در StringBuilder نیست.


پاسخ 2:

پاسخ کوتاه: ممکن است باشد ، اما بیشتر اوقات ارزش نگرانی ندارد. کد روشن را بهینه سازی اولیه ترجیح دهید.

JVM های مدرن می توانند زنجیره رشته را با "+" بهینه کرده و آن را به StringBuilder تبدیل کنند. از آنجا که می توانید ببینید رشته حاصل چه مدت طول خواهد کشید ، می توانید در ابتدا اندازه صحیح را به StringBuilder اختصاص دهید. اگر با استفاده از اندازه آرایه پیش فرض خودتان یک StringBuilder ایجاد کنید ، ممکن است آرایه کاراکتر بعداً بزرگ شود. این امر به کپی آرایه نیاز دارد و ممکن است کندتر باشد.

از زمان جاوا 9 ، به هم پیوستن رشته ها به طور قابل توجهی بهینه شده است و استراتژی در زمان اجرا تعیین می شود.

اگر بارها و بارها به یک رشته در یک حلقه اضافه می کنید ، احتمالاً نمی توانید با StringBuilder اشتباه کنید ، اما در صورت شناخت اندازه صحیح را از قبل مشخص کنید. اگر این خواندن راحت تر است ، در خارج از حلقه ها به "+" بچسبید. و اعتماد داشته باشید که JVM بهتر از شما بهینه خواهد شد.