مدیریت رشته جاوا: استخر رشته در مقابل هیپ رشته توضیح داده شده است

در جاوا رشته ها یکی از رایج ترین انواع داده ها هستند. برای بهینه سازی استفاده از حافظه و بهبود عملکرد، جاوا از مفهومی به نام String Pool استفاده می کند. این پست وبلاگ، استخر رشته و پشته رشته را با استفاده از یک مثال کد ساده برای نشان دادن این مفاهیم توضیح می دهد.
مثال کد
بیایید با یک برنامه پایه جاوا شروع کنیم که روش های مختلف ایجاد رشته ها را نشان می دهد و آنها را با استفاده از آن مقایسه می کند ==
اپراتور و .equals()
روش.
public class Main {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s3 == s4); // false
System.out.println(s1.equals(s2)); // true
System.out.println(s1.equals(s3)); // true
System.out.println(s3.equals(s4)); // true
}
}
استخر رشته
String Pool، همچنین به عنوان استخر رشته های داخلی شناخته می شود، یک منطقه حافظه ویژه است که جاوا حروف الفبای رشته ها را در آن ذخیره می کند. هنگامی که یک رشته به معنای واقعی کلمه ایجاد می کنید، جاوا ابتدا بررسی می کند که آیا رشته از قبل در استخر وجود دارد یا خیر. اگر این کار را کرد، مرجع موجود را برمی گرداند. اگر نه، رشته جدید را به استخر اضافه می کند. این به صرفه جویی در حافظه با اجتناب از ایجاد چندین نمونه از یک رشته کمک می کند.
در کد بالا:
String s1 = "Hello";
String s2 = "Hello";
هر دو s1
و s2
به همان رشته در String Pool اشاره کنید. از این رو، s1 == s2
برمی گرداند true
زیرا هر دو مرجع به یک شی در حافظه اشاره می کنند.
پشته رشته
هنگامی که یک رشته با استفاده از new
کلمه کلیدی، جاوا یک شی رشته جدید در حافظه پشته ایجاد می کند، حتی اگر یک رشته یکسان در String Pool وجود داشته باشد. Heap یک ناحیه حافظه بزرگتر است که در آن تمام اشیاء جاوا، از جمله رشته هایی که با آن ایجاد شده اند، است new
، ذخیره می شوند.
در کد بالا:
String s3 = new String("Hello");
String s4 = new String("Hello");
اینجا، s3
و s4
دو شی مختلف در پشته هستند که هر کدام شامل رشته “Hello” هستند. از این رو، s3 == s4
برمی گرداند false
زیرا آنها اشیاء متمایز هستند.
مقایسه رشته ها
جاوا دو راه برای مقایسه رشته ها ارائه می دهد:
- این
==
اپراتور بررسی می کند که آیا دو مرجع به یک شی اشاره دارند یا خیر. - این
.equals()
متد بررسی می کند که آیا دو رشته دارای مقدار یکسانی هستند یا خیر.
در مثال کد:
-
s1.equals(s2)
برمی گرداندtrue
زیرا هر دو رشته مقدار “Hello” یکسانی دارند. -
s1.equals(s3)
برمی گرداندtrue
زیرا هر دو رشته با وجود اینکه اشیاء متفاوتی هستند، ارزش یکسانی دارند. -
s3.equals(s4)
برمی گرداندtrue
به همان دلیل.
با این حال، با استفاده از ==
:
-
s1 == s2
برمی گرداندtrue
زیرا هر دو به یک شی در String Pool اشاره دارند. -
s1 == s3
برمی گرداندfalse
زیرا آنها به اشیاء مختلف (یکی در استخر، یکی در پشته) اشاره می کنند. -
s3 == s4
برمی گرداندfalse
زیرا آنها اشیاء مختلف در پشته هستند.
نتیجه
درک String Pool و String Heap برای نوشتن کد جاوا کارآمد بسیار مهم است. String Pool با استفاده مجدد از اشیاء رشته غیرقابل تغییر به صرفه جویی در حافظه و بهبود عملکرد کمک می کند، در حالی که String Heap فضایی را برای رشته های ایجاد شده به صورت پویا فراهم می کند. با استفاده از ==
اپراتور برای مقایسه مرجع و .equals()
روش مقایسه ارزش به توسعه دهندگان اجازه می دهد تا رشته ها را بر اساس نیازهای خاص خود به درستی مدیریت کنند. با استفاده از این مفاهیم می توانید برنامه های جاوا کارآمدتر و قابل اعتمادتری بنویسید.