آموزش جاوا - فریمورک مجموعهها
قبل از جاوا ۲، جاوا کلاسهایی مانند Dictionary (فرهنگنامه)، Vector (بردار)، Stack (پشته) ، Properties (ویژگیها) را برای ذخیره و کنترل گروهی از اشیاء فراهم میکرد. این کلاسها با ارزش بودند، اما یک موضوع مشترک نداشتند.بنابراین، روش استفاده از Vector با روش استفاده از Properties متفاوت بود.
فریمورک مجموعهها برای رسیدن به چندین هدف طراحی شده است، مانند:
-
فریمورک باید عملکرد بالایی داشته باشد. پیادهسازیهای مربوط به مجموعههای اساسی (آرایههای پویا، لیستهای پیوندی، درختها و جداول هش) بسیار کارآمد بودند.
-
فریمورک باید امکان استفاده مشابه برای انواع مختلفی از مجموعهها را به ارمغان آورد و با درجه بالایی از همکاری و قابلیت تعامل عمل کند.
-
فریمورک باید امکان گسترش و/یا تطبیق یک مجموعه را به راحتی فراهم کند.
به این منظور، کلیه فریمورک مجموعهها بر اساس مجموعهای از رابطهای استاندارد طراحی شدهاند. چندین پیادهسازی استاندارد مانند LinkedList (لینکدلیست)، HashSet (مجموعه هش) و TreeSet (مجموعه درختی) از این رابطها فراهم شدهاند که میتوانید از آنها به صورت اصلی استفاده کنید و در صورت تمایل میتوانید پیادهسازی خودتان را نیز انجام دهید.
فریمورک مجموعهها یک معماری متحد برای نمایش و کنترل مجموعهها است. تمامی فریمورکهای مجموعهها شامل موارد زیر میشوند −
-
رابطها − اینها انواع دادههای انتزاعی هستند که مجموعهها را نمایش میدهند. رابطها اجازه میدهند که مجموعهها مستقل از جزئیات نمایش آنها کنترل شوند. در زبانهای شیءگرا، رابطها معمولاً ساختار سلسله مراتبی دارند.
-
پیادهسازیها، یعنی کلاسها − اینها پیادهسازیهای قابل استفاده از رابطهای مجموعهها هستند. در واقع، آنها ساختارهای داده قابل استفاده مجدد هستند.
-
الگوریتمها − اینها متدهایی هستند که عملیات مفیدی مانند جستجو و مرتبسازی را بر روی اشیاءی که رابطهای مجموعه را پیادهسازی میکنند، انجام میدهند. این الگوریتمها به صورت چندریختی هستند: به عبارت دیگر، همان متد میتواند بر روی بسیاری از پیادهسازیهای مختلف مناسب رابط مجموعه مورد نظر استفاده شود.
علاوه بر مجموعهها، فریمورک تعدادی رابط و کلاس نقشه نیز تعریف میکند. نقشهها جفتهای کلید/مقدار را ذخیره میکنند. اگرچه نقشهها در استفاده صحیح از اصطلاح، به عنوان مجموعهها شمرده نمیشوند، اما به طور کامل با مجموعهها یکپارچه شدهاند.
رابطهای مجموعه
فریمورک مجموعهها تعدادی رابط را تعریف میکند. این بخش یک نمای کلی از هر رابط ارائه میدهد −
ردیف | رابط و توضیحات |
---|---|
۱ | رابط مجموعه
این به شما امکان میدهد با گروهی از اشیاء کار کنید؛ در سراسر سلسله مراتب مجموعهها در بالاترین سطح قرار دارد. |
۲ | رابط لیست
این از رابط مجموعه گسترش مییابد و نمونهای از لیست مجموعهای مرتب از عناصر را ذخیره میکند. |
۳ | مجموعه
این از مجموعه گسترش مییابد تا با مجموعههایی که باید عناصر یکتا را شامل کنند، کار کند. |
۴ | مجموعه مرتب
این از مجموعه گسترش مییابد تا با مجموعههای مرتب کار کند. |
۵ | نقشه
این کلیدهای یکتا را به مقادیر متناظر نگاشت میکند. |
۶ | ورودی نقشه
این یک عنصر (جفت کلید/مقدار) در یک نقشه را توصیف میکند. این یک کلاس داخلی از نقشه است. |
۷ | نقشه مرتب
این از نقشه گسترش مییابد تا کلیدها به ترتیب صعودی نگهداری شوند. |
۸ | شمارش
این رابط قدیمی متداولی را تعریف میکند که شما را قادر میسازد تا عناصر یک مجموعه اشیاء را به ترتیب یکییکی شمارش (دریافت) کنید. این رابط قدیمی توسط Iterator جایگزین شده است. |
کلاسهای مجموعه
جاوا یک مجموعه از کلاسهای استاندارد مجموعه را ارائه میدهد که رابطهای مجموعه را پیادهسازی میکنند. برخی از کلاسها پیادهسازیهای کاملی را ارائه میدهند که میتوان به همان شکل استفاده کرد و دیگران کلاسهای انتزاعی هستند که پیادهسازیهای اولیهای را ارائه میدهند که به عنوان نقطه شروعی برای ایجاد مجموعههای محسوب میشوند.
کلاسهای استاندارد مجموعه در جدول زیر خلاصه شدهاند −
ردیف | کلاس و توضیحات |
---|---|
۱ |
AbstractCollection بیشتر رابط Collection را پیادهسازی میکند. |
۲ |
AbstractList از AbstractCollection گسترش مییابد و بیشتر رابط List را پیادهسازی میکند. |
۳ |
AbstractSequentialList از AbstractList برای استفاده توسط یک مجموعه که در دسترسی متوالی به عناصر خود استفاده میکند، گسترش مییابد. |
۴ | LinkedList
با گسترش AbstractSequentialList یک لیست پیوندی را پیادهسازی میکند. |
۵ | ArrayList
با گسترش AbstractList یک آرایه پویا را پیادهسازی میکند. |
۶ |
AbstractSet از AbstractCollection گسترش مییابد و بیشتر رابط Set را پیادهسازی میکند. |
۷ | HashSet
با گسترش AbstractSet برای استفاده با جدول هش استفاده میشود. |
۸ | LinkedHashSet
از HashSet گسترش مییابد تا اجراهای ترتیب درج را امکانپذیر کند. |
۹ | TreeSet
یک مجموعه ذخیره شده در یک درخت را پیادهسازی میکند. از AbstractSet گسترش مییابد. |
۱۰ |
AbstractMap بیشتر رابط Map را پیادهسازی میکند. |
۱۱ | HashMap
از AbstractMap برای استفاده با جدول هش استفاده میشود. |
۱۲ | TreeMap
از AbstractMap برای استفاده با یک درخت استفاده میشود. |
۱۳ | WeakHashMap
از AbstractMap برای استفاده با جدول هش با کلیدهای ضعیف استفاده میشود. |
۱۴ | LinkedHashMap
از HashMap گسترش مییابد تا اجراهای ترتیب درج را امکانپذیر کند. |
۱۵ | IdentityHashMap
از AbstractMap استفاده میکند و همزمانی مرجع را هنگام مقایسه اسناد استفاده میکند. |
کلاسهای AbstractCollection، AbstractSet، AbstractList، AbstractSequentialList و AbstractMap پیادهسازیهای اسکلتی از رابطهای اصلی مجموعه را ارائه میدهند تا تلاش مورد نیاز برای پیادهسازی آنها را به حداقل برسانند.
کلاسهای legacy زیر که توسط java.util تعریف شدهاند، در فصل قبل بحث شدهاند −
ردیف | کلاس و توضیحات |
---|---|
۱ | Vector
این یک آرایه پویا را پیادهسازی میکند. شباهتی به ArrayList دارد، اما تفاوتهایی نیز وجود دارد. |
۲ | Stack
استک یک زیرکلاس از Vector است که یک استک معمولی last-in، first-out را پیادهسازی میکند. |
۳ | Dictionary
دیکشنری یک کلاس انتزاعی است که یک مخزن ذخیره کلید/مقدار را نمایش میدهد و به همان شکلی کار میکند که Map کار میکند. |
۴ | Hashtable
Hashtable بخشی از java.util اصلی بوده و یک پیادهسازی محکم از یک Dictionary است. |
۵ | Properties
Properties یک زیرکلاس از Hashtable است. برای حفظ لیستهایی از مقادیر که کلید آنها یک رشته و مقدار آن نیز یک رشته است، استفاده میشود. |
۶ | BitSet
یک کلاس BitSet یک نوع خاصی از آرایهای را ایجاد میکند که مقادیر بیت را نگه میدارد. این آرایه میتواند به اندازه نیاز بزرگ شود. |
الگوریتمهای مجموعه
چارچوب مجموعه چند الگوریتم را تعریف میکند که میتواند بر روی مجموعهها و نگاشتها اعمال شود. این الگوریتمها به عنوان متدهای استاتیک در داخل کلاس Collections تعریف شدهاند.
چندین متد ممکن است یک ClassCastException را پرتاب کنند، که هنگام تلاش برای مقایسه نوعهای ناسازگار اتفاق میافتد، یا یک UnsupportedOperationException را پرتاب کنند، که هنگام تلاش برای تغییر یک مجموعه غیرقابل تغییر اتفاق میافتد.
مجموعهها سه متغیر استاتیک را تعریف میکنند: EMPTY_SET، EMPTY_LIST و EMPTY_MAP. همه آنها غیرقابل تغییر هستند.
ردیف | الگوریتم و توضیحات |
---|---|
۱ | الگوریتمهای مجموعه
اینجا لیستی از همه پیادهسازیهای الگوریتم وجود دارد. |
نحوه استفاده از Iterator
اکثراً، میخواهید از عناصر موجود در یک مجموعه عبور کنید. به عنوان مثال، ممکن است بخواهید هر عنصر را نمایش دهید.
سادهترین راه برای انجام این کار استفاده از یک iterator است که یک شیء است که به هر دو رابط Iterator یا ListIterator پیادهسازی میکند.
Iterator به شما امکان میدهد از یک مجموعه عبور کنید و عناصر را دریافت یا حذف کنید. ListIterator رابط Iterator را گسترش میدهد تا امکان ترaversal دوطرفه لیست و تغییر عناصر را فراهم کند.
ردیف | متد Iterator و توضیحات |
---|---|
۱ | استفاده از Java Iterator
اینجا لیستی از همه متدهای ارائه شده توسط رابطهای Iterator و ListIterator وجود دارد. |
نحوه استفاده از Comparator
هر دو TreeSet و TreeMap عناصر را در یک ترتیب مرتب نگهداری میکنند. با این حال، مشخص میکند که دقیقاً چه ترتیب مرتب به چه معناست.
این رابط به ما امکان میدهد یک مجموعه داده شده را به هر تعداد نحوه مختلف مرتب کنیم. همچنین این رابط قابل استفاده برای مرتب سازی هر نمونه از هر کلاسی است (حتی کلاسهایی که نمیتوانیم تغییر دهیم).
ردیف | متد Iterator و توضیحات |
---|---|
۱ | استفاده از Java Comparator
اینجا لیستی از همه متدهایی با مثالهایی که توسط رابط Comparator ارائه میشوند، وجود دارد. |
خلاصه
چارچوب مجموعههای جاوا به برنامهنویس دسترسی به ساختارهای داده پیشبسته و همچنین الگوریتمهایی برای مدیریت آنها میدهد.
یک مجموعه شیءی است که میتواند به مراجع شیء دیگر ارجاع دهد. رابطهای مجموعه عملیاتی را که میتوان روی هر نوع مجموعه انجام داد، اعلام میکنند.
کلاسها و رابطهای چارچوب مجموعهها در بسته java.util قرار دارند.