صادق خانزادی
صادق خانزادی
خواندن ۴ دقیقه·۴ ماه پیش

Mutable VS Immutable in java

کدام یک از collection ها در جاوا mutable و کدام یک immutable است؟


در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.

این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .

Mutable VS Immutable in java

StringBuilder vs StringBuffer vs String

Integer vs int

HashMap vs TreeMap vs Set

Heap And Stack

Memory Heap vs Memory Leak

Integer Constant Pool

Integer Pool vs String Pool

Ternary Operator

Autoboxing


قابلیت تغییر (Mutability) در مجموعه‌های جاوا

در جاوا، مجموعه‌ها (Collections) به دو دسته اصلی قابل تغییر (Mutable) و غیرقابل تغییر (Immutable) تقسیم می‌شوند. این تقسیم‌بندی بر اساس امکان تغییر محتویات مجموعه پس از ایجاد آن صورت می‌گیرد.

مجموعه‌های قابل تغییر (Mutable Collections)

مجموعه‌های قابل تغییر به شما اجازه می‌دهند پس از ایجاد، عناصر را به آن‌ها اضافه، حذف یا تغییر دهید. این ویژگی در بسیاری از سناریوها بسیار مفید است، اما باید با احتیاط استفاده شود، زیرا تغییرات در یک مجموعه می‌تواند بر روی قسمت‌های دیگر برنامه نیز تأثیر بگذارد.

به طور معمول، متدی برای ویرایش مقدار فیلد در خود دارد، و object می تواند گسترش پیدا کند.

مثال‌هایی از مجموعه‌های قابل تغییر:

  • List: ArrayList، LinkedList
  • Set: HashSet، TreeSet
  • Map: HashMap، TreeMap

چرا از مجموعه‌های قابل تغییر استفاده می‌کنیم؟

  • انعطاف‌پذیری: توانایی تغییر محتویات مجموعه در طول اجرای برنامه
  • کارایی: در بسیاری از عملیات، مجموعه‌های قابل تغییر کارایی بالاتری دارند

مثال :

public class MutableExample { private String name; MutableClass(String name) { this.name = name; } public String getName() { return name; } // this setter can modify the name public void setName(String name) { this.name = name; } public static voidmain(String[] args) { MutableExample obj =newMutableExample(&quottest&quot); System.out.println(obj.getName()); // update the name, this object is mutable obj.setName(&quotnewTest&quot); System.out.println(obj.getName()); } } // خروجی : test newTest

مجموعه‌های غیرقابل تغییر (Immutable Collections)

مجموعه‌های غیرقابل تغییر پس از ایجاد، نمی‌توانند تغییر کنند. هرگونه تغییر در این مجموعه‌ها منجر به ایجاد یک مجموعه جدید می‌شود. این ویژگی به بهبود امنیت و پایداری برنامه کمک می‌کند، زیرا از تغییرات ناخواسته در داده‌ها جلوگیری می‌کند.

برای ایجاد یک object تغییر ناپدیر (immutable)، کلاس را به صورت final تعریف کرده، و هیچ متدی برای ویرایش فیلدها ایجاد نکنید.

مثال‌هایی از مجموعه‌های غیرقابل تغییر:

String

  • غیرقابل تغییر (Immutable): هنگامی که یک شیء از نوع String ایجاد می‌شود، مقدار آن نمی‌تواند تغییر کند. هر عملیاتی که به نظر می‌رسد یک رشته را تغییر می‌دهد، در واقع یک رشته جدید ایجاد می‌کند و مرجع آن را به متغیر اصلی اختصاص می‌دهد.

StringBuilder

  • قابل تغییر (Mutable): برخلاف String، اشیاء از نوع StringBuilder را می‌توان پس از ایجاد تغییر داد. این ویژگی باعث می‌شود که StringBuilder برای عملیات الحاق و دستکاری رشته‌ها بسیار کارآمد باشد.

StringBuffer

  • قابل تغییر (Mutable): مانند StringBuilder، اشیاء از نوع StringBuffer نیز قابل تغییر هستند.


  • Collections.unmodifiableList: این متد یک نمای غیرقابل تغییر از یک List ایجاد می‌کند.
  • Collections.unmodifiableSet: این متد یک نمای غیرقابل تغییر از یک Set ایجاد می‌کند.
  • Collections.unmodifiableMap: این متد یک نمای غیرقابل تغییر از یک Map ایجاد می‌کند.

مثال :

// make this class final, no one can extend this class public final classImmutableExample { private String name; ImmutableExample (String name) { this.name = name; } public String getName(){ return name; } //no setter public static void main(String[] args) { ImmutableExample obj = new ImmutableExample(&quottest&quot); System.out.println(obj.getName()); // there is no way to update the name after the object is created. // obj.setName(&quotnewTest&quot); //System.out.println(obj.getName()); } } // خروجی test

چرا از مجموعه‌های غیرقابل تغییر استفاده می‌کنیم؟

  • امنیت: جلوگیری از تغییرات ناخواسته در داده‌ها
  • پایداری: اطمینان از اینکه داده‌ها در طول برنامه ثابت می‌مانند
  • به اشتراک‌گذاری: می‌توان به صورت ایمن مجموعه‌های غیرقابل تغییر را بین چندین بخش از برنامه به اشتراک گذاشت

چه زمانی از کدام نوع استفاده کنیم؟

  • مجموعه‌های قابل تغییر: زمانی که نیاز به تغییر دینامیکی محتویات یک مجموعه دارید.
  • مجموعه‌های غیرقابل تغییر: زمانی که می‌خواهید داده‌ها را ایمن نگه دارید و از تغییرات ناخواسته جلوگیری کنید.

نکته مهم:

  • بسیاری از کلاس‌های مجموعه در جاوا متدهایی را ارائه می‌دهند که یک نمای غیرقابل تغییر از یک مجموعه قابل تغییر ایجاد می‌کنند. این کار به شما اجازه می‌دهد تا از مزایای هر دو نوع مجموعه استفاده کنید.
  • در جاوا 8 و نسخه‌های بالاتر، کلاس‌های Stream نیز برای کار با مجموعه‌ها به صورت غیرقابل تغییر استفاده می‌شوند.

جمع‌بندی:

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


منتظر نگاه های زیباتون هستم .

موفق و پیروز باشید.

javaimmutablecollection
Java Developer - Technical Team Lead At Dotin
شاید از این پست‌ها خوشتان بیاید