منظور از غیرقابل تغییر بودن چیست؟
وقتی میگوییم چیزی غیرقابل تغییر است، یعنی پس از ایجاد نمیتوان آن را تغییر داد. در جاوا، این مفهوم برای رشتهها صدق میکند. یعنی پس از ایجاد یک شیء رشتهای، محتوای آن دیگر قابل تغییر نیست. اگر بخواهیم یک رشته را تغییر دهیم، جاوا رشته اصلی را دستکاری نمیکند، بلکه یک شیء رشتهای جدید میسازد.چگونه رشتهها در جاوا غیرقابل تغییر هستند؟
رشتهها در جاوا به منظور استفاده بهینه از حافظه غیرقابل تغییر هستند. رشتههایی که در جاوا بهصورت immutable تعریف میشوند، از یک فضای مشترک در حافظه (pool) استفاده میکنند تا از ایجاد نسخههای تکراری با مقدار یکسان جلوگیری شود. کلاس String و تمامی کلاسهای بستهبندی (wrapper classes) مانند Boolean، Character، Byte، Short، Integer، Long، Float و Double در جاوا نیز غیرقابل تغییر هستند. کاربران میتوانند کلاسهای غیرقابل تغییر مخصوص به خود را نیز بسازند.هنگامی که از متدهایی مانند ()concat یا ()replace استفاده میکنیم، این متدها رشتهی اصلی را تغییر نمیدهند، بلکه یک رشتهی جدید با محتوای جدید ایجاد میکنند. این کار از بروز خطاهایی که ممکن است در اثر تغییر دادههای مشترک بین بخشهای مختلف برنامه رخ دهد، جلوگیری میکند.
بیایید این موضوع را با یک مثال درک کنیم:
} public static void main(String[ ] args)
;"String s1 = "knowledge
String s2 = s1; // s2 points to the same "knowledge
s1 = s1.concat(" base"); // creates a new String "knowledge base
; System.out.println(s1)
{
{
خروجی:
توضیح:
وقتی متد s1.concat(" base") فراخوانی میشود، رشتهی اصلی "knowledge" تغییر نمیکند. در عوض، یک رشتهی جدید با مقدار "knowledge base" ساخته شده و به متغیر s1 اختصاص مییابد. رشتهی اولیه بدون تغییر باقی میماند.
چرا رشتههای جاوا غیرقابل تغییر هستند؟
استخر رشتهها (String Pool):
جاوا رشتههای متنی (literals) را برای صرفهجویی در حافظه در یک استخر (pool) ذخیره میکند. غیرقابل تغییر بودن باعث میشود اگر چندین متغیر به یک رشته مشترک اشاره کنند، تغییرات توسط یکی از آنها روی بقیه تأثیر نگذارد.امنیت:
رشتهها معمولاً برای نگهداری دادههای حساس مانند نام کاربری و رمز عبور استفاده میشوند. غیرقابل تغییر بودن از تغییرات مخرب و دستکاری دادهها توسط مهاجمان جلوگیری میکند.ایمنی در برنامههای چندنخی (Thread Safety):
از آنجایی که مقدار رشتهها قابل تغییر نیست، بهطور پیشفرض برای استفاده همزمان توسط چند نخ (thread) ایمن هستند.کارایی:
ماشین مجازی جاوا (JVM) از رشتههای موجود در String Pool مجدداً استفاده میکند و این باعث بهینهسازی در مصرف حافظه و افزایش عملکرد میشود.مثالی برای نشان دادن غیرقابل تغییر بودن رشتهها در جاوا
برنامه زیر غیرقابل تغییر بودن رشتهها را با استفاده از متد concat() نشان میدهد، جایی که تلاش میکنیم یک رشته را تغییر دهیم:
Java Strings are immutable //
;*.import java.io
} class GFG
} public static void main(String[ ] args)
;"String s1 = "java
; "creates a new String "java rules //
but does not change s1 //
;s1.concat(" rules")
"s1 still refers to "java//
; System.out.println("s1 refers to " + s1)
{
{
خروجی:
توضیح:
در مثال بالا، با اینکه متد ()concat را فراخوانی کردهایم تا " rules" را به رشته اضافه کنیم، رشتهی اصلی s1 همچنان به مقدار "java" اشاره میکند. رشتهی جدید "java rules" ایجاد میشود، اما چون به هیچ متغیری اختصاص داده نشده، از بین میرود.
ورود و ثبت نام برای ارسال نظر وارد شوید