اشیای String مشابه اشیای StringBuilder هستند، با این تفاوت که String غیرقابل تغییر است در حالی که StringBuilder قابل تغییر است.
از نظر داخلی، اشیای StringBuilder بهعنوان آرایههایی با طول متغیر رفتار میکنند که شامل توالی از کاراکترها هستند. در هر لحظه، طول و محتوای توالی از طریق فراخوانی Methodها قابل تغییر است.
همیشه از String استفاده کنید مگر آنکه StringBuilder مزیتی از نظر سادگی کد (مثلاً مثال برنامهٔ انتهای این بخش) یا عملکرد بهتر فراهم کند. قبل از Java SE 9، اگر تعداد زیادی رشته را به هم متصل میکردید، الحاق به StringBuilder ممکن بود کارآمدتر باشد. اتصال رشتهها از Java SE 9 بهینه شده و اتصال رشتهها کارآمدتر از الحاق StringBuilder شده است.
کلاس StringBuilder مانند کلاس String، Method length() دارد که طول توالی کاراکترها در builder را برمیگرداند.
برخلاف رشتهها، هر StringBuilder همچنین یک ظرفیت (Capacity) دارد — تعداد فضاهای کاراکتری که اختصاص داده شدهاند. ظرفیت که توسط Method capacity() برگردانده میشود، همیشه بزرگتر یا مساوی طول است (معمولاً بزرگتر) و در صورت نیاز برای تطبیق با الحاقها به StringBuilder بهطور خودکار گسترش مییابد.
Constructorهای زیر کلاس StringBuilder را میتوانید استفاده کنید:
StringBuilder(): یک StringBuilder خالی با ظرفیت ۱۶ ایجاد میکند (۱۶ عنصر خالی).StringBuilder(CharSequence cs): StringBuilderای حاوی همان کاراکترهای CharSequence مشخصشده به همراه ۱۶ عنصر خالی اضافی در انتها ایجاد میکند.StringBuilder(int initCapacity): StringBuilder خالی با ظرفیت اولیهٔ مشخصشده ایجاد میکند.StringBuilder(String s): StringBuilderای که مقدارش با رشتهٔ مشخصشده مقداردهی اولیه شده به همراه ۱۶ عنصر خالی اضافی در انتها ایجاد میکند.برای مثال:
// ایجاد builder خالی، ظرفیت ۱۶
StringBuilder sb = new StringBuilder();
// اضافهکردن رشتهٔ ۹ کاراکتری در ابتدا
sb.append("Greetings");
StringBuilderای با طول ۹ و ظرفیت ۱۶ ایجاد میکند:
[تصویر: طول و ظرفیت StringBuilder — طول = 9, ظرفیت = 16, با فضاهای خالی باقیمانده]
کلاس StringBuilder Methodهایی مرتبط با طول و ظرفیت دارد که کلاس String ندارد:
void setLength(int newLength): طول توالی کاراکترها را تنظیم میکند. اگر newLength کمتر از length() باشد، کاراکترهای انتهای توالی بریده میشوند. اگر newLength بیشتر از length() باشد، کاراکترهای null به انتهای توالی اضافه میشوند.void ensureCapacity(int minCapacity): تضمین میکند که ظرفیت حداقل برابر با حداقل مشخصشده باشد.تعدادی عملیات (مثلاً append()، insert() یا setLength()) میتوانند طول توالی کاراکترها را در StringBuilder به قدری افزایش دهند که length() نتیجه بیشتر از capacity() فعلی باشد. در این حالت، ظرفیت بهطور خودکار افزایش مییابد.
عملیات اصلی StringBuilder که در String موجود نیستند، Methodهای append() و insert() هستند. هر دو Overload شدهاند تا دادهٔ هر نوعی را بپذیرند. هرکدام آرگومان خود را به رشته تبدیل و سپس کاراکترهای آن رشته را به توالی کاراکترها در StringBuilder الحاق یا درج میکنند. Method append این کاراکترها را همیشه در انتهای توالی موجود اضافه میکند، در حالی که insert در نقطهٔ مشخصشده درج میکند.
append(): هر نوع Primitive یا شیء را میتوانید به StringBuilder الحاق کنید. داده قبل از عملیات الحاق به رشته تبدیل میشود.delete(int start, int end): زیرتوالی از start تا end - 1 (شامل) را از توالی کاراکترهای StringBuilder حذف میکند.deleteCharAt(int index): کاراکتر در ایندکس مشخصشده را حذف میکند.insert(int offset, Object): هر نوع Primitive یا شیء را در offset مشخصشده درج میکند. داده قبل از عملیات درج به رشته تبدیل میشود. این Method Overloadهایی برای هر نوع Primitive، آرایههای char، String و CharSequence دارد.replace(int start, int end, String s) و setCharAt(int index, char c): کاراکترها را جایگزین میکنند.reverse(): توالی کاراکترها را معکوس میکند.toString(): رشتهای حاوی توالی کاراکترهای builder برمیگرداند.نکته: میتوانید هر Method ازStringرا روی شیءStringBuilderاعمال کنید، به این شکل که ابتدا StringBuilder را باtoString()به String تبدیل و سپس String را با ConstructorStringBuilder(String)مجدداً به StringBuilder تبدیل کنید.
برنامهٔ StringDemo که در بخش «Strings» فهرست شده بود، نمونهای از برنامهای است که اگر به جای String از StringBuilder استفاده شود کارآمدتر خواهد بود.
StringDemo یک Palindrome را معکوس میکرد. لیست کد مجدداً در اینجا آورده شده است:
public class StringDemo {
public static void main(String[] args) {
String palindrome = "Dot saw I was Tod";
int len = palindrome.length();
char[] tempCharArray = new char[len];
char[] charArray = new char[len];
// قرار دادن رشتهٔ اصلی در آرایهای از کاراکترها
for (int i = 0; i < len; i++) {
tempCharArray[i] =
palindrome.charAt(i);
}
// معکوس کردن آرایهٔ کاراکترها
for (int j = 0; j < len; j++) {
charArray[j] =
tempCharArray[len - 1 - j];
}
String reversePalindrome =
new String(charArray);
IO.println(reversePalindrome);
}
}
خروجی:
doT saw I was toD
برای انجام معکوسسازی رشته، برنامه رشته را به آرایهٔ کاراکترها تبدیل میکند (حلقهٔ for اول)، آرایه را در آرایهٔ دومی معکوس میکند (حلقهٔ for دوم) و سپس مجدداً به رشته تبدیل میکند.
اگر رشتهٔ Palindrome را به StringBuilder تبدیل کنید، میتوانید از Method reverse() کلاس StringBuilder استفاده کنید. این کار کد را سادهتر و خواناتر میکند:
public class StringBuilderDemo {
public static void main(String[] args) {
String palindrome = "Dot saw I was Tod";
StringBuilder sb = new StringBuilder(palindrome);
sb.reverse(); // معکوس کردن
IO.println(sb);
}
}
خروجی یکسان:
doT saw I was toD
توجه کنید که println() یک StringBuilder را چاپ میکند، چون sb.toString() بهطور ضمنی فراخوانی میشود، مانند هر شیء دیگری در فراخوانی println.
نکته: کلاسStringBufferنیز وجود دارد که دقیقاً مشابهStringBuilderاست، با این تفاوت که بهدلیل Synchronized بودن Methodهایش، Thread-Safe است. مگر آنکه واقعاً به کلاس Thread-Safe نیاز داشته باشید، نیازی به استفاده ازStringBufferنیست.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/