فرامرز افضلی
فرامرز افضلی
خواندن ۲ دقیقه·۳ سال پیش

String pool in Java

رشته در جاوا یکی از مفاهیم مهم است. در این بخش، ما قصد داریم به مفهوم String Pool و String Intern بپردازیم.

استرینگ-پول چیزی نیست جز یک فضای ذخیره سازی در مموری هیپ. درست مثل تخصیص حافظه به شی. به طور پیش فرض، خالی است. هر زمان که رشته ای ایجاد می کنیم، شی مورد نظر مقداری فضا در مموری هیپ اشغال می کند. ایجاد تعدادی رشته ممکن است هزینه بر باشد و ممکن است عملکرد را هم کاهش دهد.

ماشین مجازی جاوا (JVM) مراحلی را در طول مقداردهی اولیه رشته انجام می دهد که باعث افزایش کارایی و کاهش بار حافظه می شود. برای کاهش تعداد اشیاء رشته ایجاد شده در JVM، کلاس String مجموعه ای از رشته ها را نگه می دارد. هنگامی که ما یک رشته ایجاد می کنیم، JVM ابتدا آن را در String Pool بررسی می کند. اگر از قبل در String Pool وجود داشته باشد، تنها نمونه یا همان reference را برمی گرداند در غیر این صورت، یک شی رشته جدید درString Pool ایجاد میشود.


حال دقیق تر به قضیه نگاه میکنیم

String str1 = "Python"
String str2 = "Data Science"
String str3 = "Python"
s1==s3 //true
s2==s3 //false

چه اتفاقی افتاد؟

به تصویر زیر نگاه کنید.

ابتدا، ما یک رشته Python ایجاد کردیم و در String Pool جای گرفت. پس از آن، رشته Data Science ایجاد می شود، همچنین در String Pool قرار می گیرد. در نهایت، دوباره رشته Python را ایجاد کردیم. اما در این زمان، JVM رشته را بررسی می‌کند و متوجه می‌شود که رشته Python از قبل وجود دارد. به جای ساختن یک نمونه جدید در String Pool مرجع (reference) آن، یعنی str1 را برمی گرداند.

و حالا یک نمونه مثال دیگر با کلید واژه new

String str1 = new String ("Java");
String str2 = new String ("C++");
String str3 = new String ("Data Science");

رشته های Java, C++, Data Science ایجاد شدند. رشته های Java, C++ جدید هستند. اما Data Science در String Pool وجود دارد. همانطور که در عکس بالا دیدید تمام رشته های ایجاد شده با کلید واژه new در مموری هیپ جای می گیرند، نه در String Pool.


به قطعه کد زیر توجه کنید

public static void main(String[] args){
String s1 = "Java"
String s2 = "Java"
String s3 = new String("Java");
String s4 = new String("Java").intern();
System.out.println((s1 == s2)); // true
System.out.println((s1 == s3)); // false
System.out.println((s1 == s4)); // true
System.out.println((s2 == s4));//true
System.out.println((s3 == s4)); //false
System.out.println((s2 == s3)); //false
}


در مثال بالا میبینیم هر زمان که رشته ای را با کلید واژه new ایجاد کردیم، یک شی جدیدی در مموری هیپ ایجاد شده است. ما می‌توانیم با استفاده از متد intern کلاس String این ویژگی را متوقف کنیم.


نکته پایانی

برای هر رشته str1 و str2 عبارت str1.intern() == str2.intern تنها در صورتی true برمیگرداند که str1.equals(str2)، مقدار true برگرداند.

خب بحث String Pool و String Intern هم در اینجا به پایان رسید.
تا سری بعد ✋

جاوانرم افزاربرنامه نویسیکدنویسیکامپیوتر
توسعه دهنده جاوا
شاید از این پست‌ها خوشتان بیاید