Collections Framework به چندین سلسلهمراتب از Interface و کلاس تقسیم شده است. اولین سلسلهمراتبی که باید درک کنید این است: سلسلهمراتب Interfaceهای Collection.
توجه کنید بعضی Interfaceها حذف شدهاند که بعداً خواهید دید.
---اولین Interface در این سلسلهمراتب، Interface Iterable است و در واقع بخشی از Collections Framework نیست. با این حال ارزش ذکر دارد چون Interface فوقی (Super Interface) Interface Collection است و در نتیجه تمام Interfaceهای این سلسلهمراتب میباشد.
Interface Iterable اضافهشده به Java SE 5 (2004) است. شیئی که Iterable را پیادهسازی میکند شیئی است که میتوانید روی آن حلقه بزنید. این Interface همراه با الگوی کد for each در Java SE 5 اضافه شد.
شاید از قبل با این روش حلقهزدن روی عناصر یک Collection آشنا باشید:
اجرای این کد خروجی زیر را تولید میکند:
Duke
loves
Java
شاید از قبل بدانید که میتوانید با این الگو روی هر collection یا هر array حلقه بزنید. مشخص شده که در واقع هر نمونه از Iterable را میتوان اینجا استفاده کرد.
پیادهسازی Interface Iterable واقعاً آسان است: تنها کاری که باید بکنید فراهم کردن نمونهای از Interface دیگر، Iterator است که در ادامه خواهید دید.
تمام Interfaceهای دیگر دربارهی ذخیرهی عناصر در Containerها هستند.
Interfaceهای List و Set هر دو رفتار مشترکی دارند که توسط Interface Collection مدلسازی شده. Interface Collection چندین عملیات روی Containerهای عناصر را مدلسازی میکند. بدون ورود به جزئیات فنی (هنوز!)، اینها کارهایی هستند که میتوانید با یک Collection انجام دهید:
چون Collection مجموعهای از عناصر است، عملیات مجموعهای هم روی Interface Collection تعریف شده است:
در نهایت، Interface Collection روشهای مختلف دسترسی به عناصر را هم مدلسازی میکند:
البته همهی این عملیات روی List و Set هم موجود هستند. ممکن است بپرسید: تفاوت بین یک نمونهی سادهی Collection و نمونهای از Set یا List چیست؟
تفاوت بین List از عناصر و Collection از عناصر این است که List> ترتیبی را که عناصرش اضافه شدهاند به خاطر میسپارد.
اولین نتیجه این است که اگر روی عناصر یک list حلقه بزنید، اولین عنصری که دریافت میکنید اولین عنصری است که اضافه شده. سپس دومین را دریافت میکنید و الی آخر تا همهی عناصر دیده شوند. بنابراین ترتیب حلقهزدن روی عناصر همیشه یکسان است و توسط ترتیب اضافه شدن عناصر ثابت میشود. این تضمین را در یک Collection ساده یا Set ندارید.
مشخص شده که بعضی پیادهسازیهای
Setکه Collections Framework ارائه میدهد همیشه عناصر را با ترتیب یکسان حلقه میزنند. این ممکن است یک تأثیر تصادفی باشد. مگر اینکه از پیادهسازیSetای استفاده میکنید که ترتیب ثابت مواجهه را تضمین میکند، کد شما نباید به این رفتار تکیه کند.
نتیجهی دومی وجود دارد که شاید به اندازهی اول واضح نباشد: عناصر یک list ایندکس دارند. پرسیدن یک collection دربارهی عنصر اولاش معنا ندارد. اما پرسیدن یک list دربارهی اولین عنصرش معنا دارد، چون list این را به خاطر میسپارد.
این ایندکسها چگونه مدیریت میشوند؟ خوب، باز هم، این مسئولیت پیادهسازی است. نقش اول یک Interface مشخص کردن رفتار است، نه گفتن نحوهی پیادهسازی.
همانطور که خواهید دید، Interface List> عملیات جدیدی به Interface Collection اضافه میکند. چون عناصر یک list ایندکس دارند، میتوانید با این ایندکس کارهای زیر را انجام دهید.
تفاوت بین Set از عناصر و Collection از عناصر این است که نمیتوانید مقادیر تکراری در Set داشته باشید. میتوانید چندین نمونه از یک کلاس که برابر هستند در یک Collection داشته باشید، یا حتی یک نمونه را بیش از یک بار. این در Set مجاز نیست. نحوهی اعمال این قید مسئولیت پیادهسازی است که بعداً خواهید دید.
یکی از نتایج این رفتار این است که اضافه کردن عنصر به Set ممکن است ناموفق باشد.
سپس ممکن است از خودتان بپرسید: آیا میتوانم containerای داشته باشم که از مقادیر تکراری جلوگیری کند و عناصرش ایندکس داشته باشند؟ پاسخ ساده نیست. Collections Framework یک پیادهسازی از Set به شما میدهد که با آن عناصر را همیشه با ترتیب یکسان حلقه میزنید، اما این عناصر ایندکس ندارند پس این کلاس List را پیادهسازی نمیکند.
این تفاوت در رفتار هیچ عملیات جدیدی در Interface Set اضافه نمیکند.
Interface Set دو گسترش دارد: SortedSet و NavigableSet.
Interface SortedSet عناصرش را به ترتیب صعودی مرتب نگه میدارد. باز هم، نحوهی اعمال این مسئولیت پیادهسازی است که بعداً خواهید دید.
برای مرتبسازی عناصر، SortedSet باید عناصر شما را مقایسه کند. دو مکانیزم استاندارد در زبان جاوا برای این کار تعریف شده:
Comparable را پیادهسازی کنند و متد compareTo() ارائه دهندComparator به SortedSet بدهید تا بتواند آنها را مقایسه کند.حتی اگر عناصر شما Comparable باشند، باز هم میتوانید هنگام ساختن SortedSet یک Comparator ارائه دهید. این میتواند مفید باشد اگر نیاز دارید عناصرتان را به ترتیبی غیر از آنچه در متد compareTo() پیادهسازی شده مرتب کنید.
تفاوت بین مرتبسازی (Sorting) و ترتیبدهی (Ordering) چیست؟
Listعناصرش را به ترتیبی که اضافه شدهاند نگه میدارد وSortedSetآنها را مرتب نگه میدارد. مرتبسازی عناصر به این معناست که اولین عنصری که هنگام پیمایش مجموعه دریافت میکنید، کوچکترین است — بر اساس منطق مقایسهی مشخصشده. ترتیبدهی عناصر به این معناست که ترتیبی که آنها را به list اضافه کردید در طول عمر آن list حفظ میشود.
SortedSet عملیات متعددی به Set اضافه میکند. اینها کارهایی هستند که میتوانید با SortedSet انجام دهید:
first() و getFirst() دریافت کنید.last() و getLast() دریافت کنید.headSet و tailSet از تمام عناصر کمتر از، یا بزرگتر یا مساوی یک عنصر خاص استخراج کنید.حلقهزدن روی عناصر SortedSet از کمترین عنصر تا بزرگترین انجام میشود.
NavigableSet رفتار SortedSet را تغییر نمیدهد. عملیات مفید متعددی به SortedSet اضافه میکند، از جمله امکان حلقهزدن روی عناصر به ترتیب نزولی. جزئیات بیشتر آن را بعداً خواهید دید.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/