دانستنی‌ها

مخزن رشته چیست؟

String Pool مخزنی برای نگهداری رشته‌ها در حافظه Heap است. می‌دانیم که در جاوا برای String یک کلاس خاص وجود دارد که بوسیله عملگر new می‌توانیم شیء‌ای از نوع رشته ایجاد کنیم.

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

string

مخزن Stringها به صرفه‌جویی در استفاده از حافظه کمک زیادی می‌کند ولی در عوض زمان بیشتری برای ایجاد یک شیء صرف می‌شود.

اگر یک رشته را به یک متغیر String تخصیص دهیم، کامپایلر ابتدا داخل مخزن رشته‌ها را برای آن رشته جستجو می‌کند و اگر رشته‌ای معادلِ رشته مورد نظر ما یافت، آدرس آن را بر می‌گرداند در غیر این‌صورت یک رشته جدید داخل مخزن رشته‌ها ایجاد می‌کند و آدرس آن را بر می‌گرداند.

با این‌حال وقتی از عملگر new استفاده می‌کنیم، کامپایلر را مجبور می‌کنیم که یک شیء جدید از String در حافظه Heap ایجاد کند و بعد از آن می‌توانیم از متد intern() استفاده کنیم تا شیء ایجاد شده را داخل مخزن قرار دهد یا اینکه اگر مقداری برابر با رشته مورد نظر ما در مخزن وجود داشت، ادرس آن را برگرداند.

مفهوم String Pool یک مثال خوب برای الگوی Flyweight است.

String Interning چیست؟

String Interning روشی برای نگهداری یک کپی از هر مقدار رشته‌ای یکتا است که به غیر از ویژگی منحصر بفرد بودن باید تغییر ناپذیر هم باشد. این روش باعث می‌شود برای بعضی از عملیاتِ پردازشِ رشته زمان بیشتری صرف شود مانند ایجاد شیء رشته‌ای اما در عوض حافظه‌ی کارآمدتری خواهیم داشت. این مقادیر منحصر بفرد در String Pool ذخیره می‌شوند. بنابراین ما مخزنی داریم که شامل لیستی از عناصر منحصر بفرد و بدون تکرار هست.

به هر کپی از یک رشته‌ی منحصر بفرد که در مخزن رشته‌ها ذخیره شده است intern می‌گویند. مکانیزم String Interning در بعضی از زبان‌های برنامه‌نویسی مدرن مانند جاوا، پی‌اچ‌پی، پایتون و دات‌نت و … پشتیبانی می‌شود.

به غیر از رشته‌ها سایر اشیاء نیز می‌توانند از این مکانیزم استفاده کنند. مثلا در جاوا وقتی یک نوع داده‌ی اولیه (primitive) به کلاس متناظرِ خود تبدیل (box) می‌شود به صورت یک عنصر وارد مخزن می‌شود(interned) و به همین دلیل قطعا دو شیء تبدیل شده با یک مقدار که وارد مخزن شده‌اند، هر دو به یک شیء اشاره می‌کنند.

چرا در جاوا رشته‌ها تغییر ناپذیرند؟

  • اجرای String Pool یا مخزن رشته‌ها فقط زمانی امکان‌پذیر است که رشته‌ها تغییر ناپذیر باشند. این روش صرفه‌جوبی بسیاری در فضای حافظه می‌کند به این دلیل که چند متغیر با یک مقدار می‌توانند به یک عنصر در مخزن رشته‌ها اشاره کنند. اگر رشته‌ها تغییرپذیر بودند، مقدار هر متغیری که تغییر می‌کرد روی سایر متغیرهایی که به آن عنصر در مخزن رشته‌ها اشاره می‌کرد نیز تاثییر می‌گذاشت و مقدار آنها هم تغییر می‌کرد.
  • چون رشته‌ها تغییر ناپذیرند، برای استفاده در برنامه‌های چند نخی(Multithread)  امن هستند و یک رشته می‌تواند در بین چندین نخ (Thread) به اشتراک گذاشته شود و به همین دلیل نیازی به پیاده‌سازی مکانیزم‌های همروندی ایمن (synchronization) برای رشته‌ها نیست. رشته‌ها بصورت خودکار thread safe هستند.
  • رشته‌ها در classloaderهای جاوا استفاده می‌شوند و فراخوانی صحیح کلاس‌ها توسط Classloader حاصل تغییرناپذیری رشته‌ها است.
  • چون رشته‌ها تغییر ناپذیرند، در زمان ایجاد شیء رشته، hashcode از روی رشته‌ ساخته شده و نگهداری می‌شود (cached) و نیازی  به محاسبه مجدد ندارد به همین دلیل، رشته، معمولا بهترین انتخاب به عنوان کلید (key) در HashMap است و سرعت پردازش بیشتری نسبت به مواقعی دارد که کلاس دیگری را به عنوان کلید در HashMap انتخاب کنید.

منابع:

ویکی پدیا

JournalDev

نوشته های مشابه

‫2 دیدگاه ها

  1. سلام. ایکاش برای مطالبتون save as pdf قرار می‌دادید تا راحت تر بشه اونا رو ذخیره و چاپ کرد

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا