توانایی کار با دادههای مختلف یک ضرورت غیرقابل انکار در دنیای برنامه نویسی است. گاهی اوقات با توجه به نیازمندیهای برنامه این اطلاعات باید به صورت مجموعهای از اشیا ذخیره شوند. بر همین اساس، فریمورک Collection در جاوا ساختاری را جهت ذخیرهسازی مجموعهای از اشیا فراهم میکند. همچنین، به کمک الگوریتمهای موجود در این فریمورک عملیاتهای مختلف بر روی دادهها نظیر جستجو، مرتبسازی، درج و پیمایش قابل پیادهسازی است. بر همین اساس، در این مطلب از مجله تم آف به این سوال پاسخ داده خواهد شد که فریمورک Collection در جاوا چیست و از چه بخشهای تشکیل شده است.
با مطالعه این مطلب ضمن آشنایی با سلسله مراتب Collection در جاوا با انواع کلاسها و پیادهسازیهای مختلف از آن نیز آشنا خواهید شد. همچنین، انواع الگوریتمهای موجود در این فریمورک به همراه کاربردشان نیز مورد بررسی قرار گرفتهاند. در انتها نیز ضمن بیان مزایای استفاده از این فریمورک به متداولترین سوالات موجود در این حوزه پاسخ داده شده است.
Collection در جاوا چیست؟
فریمورک Collection در جاوا یکی از حیاتیترین بخشهای این زبان برنامه نویسی را تشکیل میدهد. مفهوم «مجموعهها» (Collections) در بیشتر زبانهای برنامه نویسی کاربرد دارد و انواع مختلف مجموعهها همچون Stack ،List ،Set ،Queue و سایر موارد توسط زبانهای برنامه نویسی پشتیبانی میشوند.
کاربرد Collection در جاوا چیست؟
به بیان ساده Collection در جاوا چارچوبی است که ساختاری برای ذخیره و مدیریت گروهی از اشیا ارائه میکند. مجموعهها را میتوان همانند ظرفهایی در نظر گرفت که چندین مورد را در یک گروه واحد ذخیره میکنند. به عنوان مثال، سبدی از میوهها، لیستی از نامها و سایر موارد را میتوان نمونه کوچکی از مجموعهها در نظر گرفت.
علاوه بر این، Collection در جاوا امکان پیادهسازی عملیاتهای مختلفی همچون جستجو، مرتبسازی، ذخیرهسازی و سایر موارد را بر روی دادههای موجود در مجموعهها فراهم میکند.
آیا کاربرد Collection محدود به زبان جاوا است؟
همان طور که پیشتر نیز عنوان شد، مفهوم Collection یا مجموعه در بیشتر زبانهای برنامه نویسی وجود دارد. ساختار Collection در جاوا ابتدا کلاسهای کمی همچون Array ،Hashtable ،Stack و Vector را در بر میگرفت. با ارائه نسخه ۱.۲ زبان جاوا فریمورک Collection به عنوان معماری استاندارد و یکپارچه جهت نمایش و دستکاری مجموعهها در این زبان معرفی شد.
تفاوت آرایه با Collection در جاوا چیست؟
آرایهها و فریمورک Collection در جاوا هر دو برای ذخیره گروهی از اشیا با نوعهای دادهای مختلف استفاده میشوند. آشنایی با تفاوتهای فریمورک Collection با سایر ساختار دادههای معروف از این نظر حائز اهمیت است که به درک بهتر این فریمورک منجر میشود. در ادامه، مهمترین تفاوتهای آرایه با Collection در جاوا آورده شده است.
مقایسه آرایه با Collection در جاوا از نظر تغییر اندازه
آرایه در جاوا به عنوان ساختار دادهای با «اندازه ثابت» (Fixed-Sized) شناخته میشود که امکان درج یا حذف عناصر بعد از ایجاد آرایه وجود ندارد. در نقطه مقابل، Collection در جاوا ساختار دادهای با قابلیت تغییر اندازه است که امکان بزرگ شدن یا کوچک شدن آن به صورت پویا وجود دارد. بنابراین، میتوان در صورت نیاز عناصر جدیدی را به آن اضافه یا عناصر قبلی را حذف کرد.
عملکرد
عملیات بازیابی و تخصیص مقدار در آرایهها در زمان مشخص و ثابتی صورت میگیرد. با این وجود، آرایه در جاوا از عملیات درج پشتیبانی نمیکند، زیرا آرایهها ساختار دادهای با اندازه ثابت هستند و نمیتوان عنصر جدیدی را بعد از ایجاد آرایه به آن اضافه کرد. در نقطه مقابل، تمام کلاسها و اینترفیسهای Collection در جاوا عملیات بازیابی، تخصیص و درج عناصر را پشتیبانی میکنند. زمان صرف شده برای انجام این عملیات متغیر است و ارتباط مستقیمی با نوع دادههای مورد استفاده دارد. در یک جمعبندی کلی میتوان گفت که آرایهها از لحاظ زمان اجرا عملکرد بسیار بهتری را نسبت به مجموعهها ارائه میدهند.
نوعهای دادهای
آرایهها در جاوا امکان نگهداری نوعهای دادهای مختلف نظیر int
، char
، long
، float
، double
، boolean
و سایر موارد را دارند. علاوه بر این، آرایهها امکان نگهداری اشیا مختلف را نیز فراهم میکنند. در نقطه مقابل، فریمورک Collection تنها امکان نگهداری از اشیا مختلف را ارائه میدهد.
مقایسه حافظه مصرفی آرایه با Collection در جاوا
به دلیل سرعت اجرای بالاتر آرایهها نسبت به Collection میزان حافظه مصرفی آنها بالاتر است و عملکرد بهتری را نیز ارائه میدهند. در نقطه مقابل، Collectionها حافظه بسیار کمتری را برای اجرا نیاز دارند و عملکرد ضعیفتری نیز ارائه میدهند.
متدها
هیچ گونه متدی برای پیادهسازی عملیاتهای مختلف بر روی آرایهها در جاوا وجود ندارد، اما میتوان به برخی از ویژگیهای آرایه نظیر طول آرایه دسترسی داشت. در نقطه مقابل، فریمورک Collection در جاوا متدهای مختلفی برای تسهیل کار با ساختار دادههای مختلف را ارائه میدهد.
مقایسه آرایه با Collection در جاوا از نظر ابعاد
یکی از ویژگیهای جذاب آرایهها در دنیای برنامه نویسی پشتیبانی آنها از چندین محور است. به هر محور در آرایهها «بُعد» (Dimension) گفته میشود. زبان برنامه نویسی جاوا از آرایههای «یک بُعدی» (Single-Dimensional) و «چند بُعدی» (Multi-Dimensional) پشتیبانی میکند. در نقطه مقابل، مفهومی تحت عنوان بُعد در فریمورک Collection معنا ندارد. با این وجود امکان پیادهسازی مجموعههای تودرتو در این ساختار وجود دارد.
پشتیبانی از جنریکها
آرایهها در جاوا تنها دادههای با نوع یکسان را ذخیره میکنند. در حالی که امکان ذخیرهسازی نوعهای دادهای یکسان و غیریکسان در فریمورک Collection وجود دارد. در نتیجه، میتوان گفت که آرایهها از نوع داده «جنریک» (Generic) پشتیبانی نمیکنند، ولی ساختار Collection امکان ذخیرهسازی نوع داده جنریک را فراهم کرده است.
مقادیر تهی و تکراری
امکان ذخیرهسازی مقادیر «تهی» (Null) و تکراری در ساختار آرایهها وجود دارد. در حالی که تنها برخی از کلاسها و اینترفیسهای موجود در فریمورک Collection اجازه استفاده از عناصر تکراری را میدهند. علاوه بر این، استفاده از مقادیر تهی در بسیاری از پیادهسازیهای ساختار Collection ممنوع است.
مرتبسازی
آرایهها در جاوا ترتیب مشخصی از عناصر را نشان میدهند که امکان دسترسی به عناصر مختلف از طریق «اندیس» (Index) یا شماره خانه عنصر وجود دارد. در نقطه مقابل، ترتیب عناصر موجود در ساختار Collection ارتباط مستقیمی با نوع کلاس یا اینترفیس پیادهسازی شده دارد. تنها برخی از ساختارهای موجود در Collection ترتیب مشخصی برای ذخیرهسازی عناصر را ارائه میدهند.
مزایای Collection در جاوا چیست؟
با توجه به کارکرد اصلی Collection در بحث ذخیرهسازی و مدیریت مجموعهها مزایای آن را به صورت زیر میتوان دستهبندی کرد.
- کوتاه کردن فرایند توسعه: فریمورک Collection در جاوا تقریباً از انواع مختلف مجموعهها پشتیبانی میکند. علاوه بر این، متدهای مختلفی نیز برای پیمایش، مرتبسازی و دستکاری دادهها در این ساختار وجود دارد. بنابراین، میتوان به جای پیادهسازی قابلیتهای مختلف بر روی مجموعهها زمان بیشتری را صرف توسعه منطق تجاری برنامه کرد.
- بهبود کیفیت: استفاده از کلاسهای اصلی Collection کیفیت برنامه را افزایش میدهد، زیرا تستهای مختلفی بر روی این کلاسهای اعمال شده است.
- قابلیت استفاده مجدد و قابلیت همکاری: کلاسهای Collection قابلیت استفاده مجدد از کد را بهبود میبخشند و میتوان از کد نوشته شده در بخشهای مختلفی استفاده کرد.
- افزایش قابلیت نگهداری کد: کلاسهای Collection در جاوا بسیار شناخته شده هستند و کمتر برنامه نویسی را میتوان پیدا کرد که از کلاسهای این فریمورک استفاده نکرده باشد. با توجه به همین مورد استفاده از کلاسها Collection به قابلیت نگهداری کد کمک میکنند.
عناصر اصلی فریمورک Collection در جاوا چیست؟
فریمورک Collection بعد از معرفی به عنوان معماری استاندارد و یکپارچه جهت مدیریت مجموعهها در جاوا تغییرات زیادی داشته است. مجموعهای از کلاسها، کتابخانهها و اینترفیسها اجزای اصلی این فریمورک را تشکیل میدهند.
در ادامه، عناصر اصلی تشکیلدهنده این فریمورک را به صورت زیر میتوان دستهبندی کرد.
- اینترفیسها
- کلاسهای پیادهسازی شده
- الگوریتمها
اینترفیسهای Collection در جاوا
اینترفیسهای Collection نوع داده انتزاعی برای نمایش مجموعهها را فراهم میکنند. اینترفیس java.util.Collection
اصلیترین اینترفیس فریمورک Collection است و در بالای سلسله مراتب مجموعهها قرار دارد. این اینترفیس شامل متدهای مهمی همچون size()
، iterator()
، add()
، remove()
و clear()
است که هر کلاس Collection باید آنها را پیادهسازی کند. تمام اینترفیسهای فریمورک Collection از طریق بسته java.util
قابل دسترسی هستند.
کلاسهای Collection در جاوا
امکان پیادهسازی کلاسهای مختلف از اینترفیس اصلی فریمورک Collection در جاوا وجود دارد. به کمک کلاسهای Collection میتوان از مجموعههای مختلفی در برنامه استفاده کرد. کلاسهای ArrayList ،LinkedList ،TreeMap ،HashMap ،TreeSet و HashSet تنها بخشی از کلاسهای Collection در جاوا را تشکیل میدهند. کلاسهای ذکر شده بخش زیادی از نیازمندیهای برنامهنویس را پوشش میدهند، اما در صورت نیاز به پیادهسازی قابلیتی خاص نیز میتوان هر کدام از کلاسها و اینترفیسهای موجود را گسترش داد. تمام کلاسهای Collection درون بستههای java.util
و java.util.concurrent
قرار دارند.
الگوریتمهای Collection در جاوا
کارکرد اصلی مجموعهها در جاوا و هر زبان برنامه نویسی دیگری فراهم آوردن امکانی برای ذخیرهسازی گروهی از دادههای مختلف است. در گام بعدی برای پیادهسازی عملکردهای پیچیدهتر نیاز به عملیاتی همچون جستجو، مرتبسازی و پیمایش این دادهها وجود دارد. بر همین اساس، الگوریتمهای Collection در جاوا متدهای مختلفی برای اجرای عملیاتی نظیر پیمایش، جستجو و مرتبسازی بر روی مجموعهها را فراهم میکنند.
سلسله مراتب فریمورک Collection در جاوا چیست؟
فریمورک Collection در جاوا ساختاری جهت مدیریت مجموعههای مختلف در این زبان را ارائه میدهد. در نتیجه، این فریمورک مجموعهای از کلاسها و اینترفیسها را شامل میشود که این کلاسها نیز از برخی کلاسهای دیگر ارثبری میکنند یا آنها را گسترش میدهند. دلیل اصلی وجود کلاسها و اینترفیسهای مختلف از فریمورک Collection کاربرد متفاوت و ارائه عملکرد منحصر به فرد توسط این کلاسها و اینترفیسها است. در تصویر زیر سلسله مراتب Collection در جاوا به همراه تمام کلاسها و اینترفیسهای موجود در آن ارائه شده است.
بررسی اینترفیسهای Collection در جاوا
اینترفیسها پایه و اساس فریمورک Collection در جاوا را تشکیل میدهند. تمام اینترفیسهای Collection از نوع «جنریک» (Generic) یا اصطلاحاً عمومی پیادهسازی میشوند. استفاده از جنریکها در تعریف کلاس این امکان را فراهم میکند تا بتوان تنها با یک مرتبه پیادهسازی از انواع دادهها استفاده کرد. در نتیجه، نیازی به پیادهسازی چندین تعریف برای نوعهای دادهای مختلف وجود ندارد.
به عنوان مثال، عبارت public interface Collection (E)
برای تعریف اینترفیس از فریمورک Collection استفاده میشود. عبارت (E)
در این تعریف به جنریکها اشاره دارد و از آن برای تعیین نوع اشیا استفاده میشود. با بررسی نوع اشیا در زمان کامپایل خطاهای زمان اجرا نیز کاهش مییابد. یکی دیگر از دلایل استفاده از جنریکها در پیادهسازی اینترفیسهای Collection در جاوا محدود کردن تعداد اینترفیسها و مدیریت بهتر آنها است. در نتیجه، برای نوعهای دادهای مختلف اینترفیس جداگانهای ارائه نمیشود.
اینترفیس Collection
اینترفیس Collection در راس ساختار مجموعهها قرار دارد. این اینترفیس شامل گروهی از اشیا است که عناصر اصلی آن را تشکیل میدهند. همچنین، پلتفرم جاوا به صورت مستقیم این اینترفیس را پیادهسازی نکرده است.
متدهای اینترفیس Collection کدامند؟
این اینترفیس متدهای مختلفی برای عملکردهای گوناگون ارائه میدهد. در ادامه، متدهای موجود در این اینترفیس به همراه عملکرد هر کدام آورده شده است.
- متد size
: تعداد عناصر موجود در مجموعه را بر میگرداند.
- متد isEmpty
: در صورت نبودن هیچ عضوی درون مجموعه مقدار true
و در غیر این صورت مقدار false
را برگشت میدهد.
- متد contains
: وجود یا عدم وجود شی مشخصی را درون مجموعه اعلام میکند.
- متد add
: برای افزودن شی جدید به مجموعه از این متد استفاده میشود.
- متد remove
: برای حذف شی مشخصی از مجموعه از این متد استفاده میشود.
- متد iterator
: عناصر موجود درون مجموعه را پیمایش میکند.
علاوه بر این، برای عملیات به صورت گسترده بر روی چندین عضو مجموعه متدهای addAll
، containAll
، retainAll
و removeAll
در دسترس هستند. همچنین، متد toArray
برای تبدیل Collection به آرایه در جاوا مورد استفاده قرار میگیرد.
اینترفیس Iterator
با استفاده از متدهای موجود در این اینترفیس میتوان عناصر موجود در Collection را پیمایش کرد. متد iterator()
شی یا نمونهای را از این اینترفیس ایجاد میکند که از طریق آن امکان دسترسی به تمام متدهای موجود در اینترفیس Iterator وجود دارد. این اینترفیس جایگزین Enumeration در فریمورک Collection شده است. اینترفیس Iterator به شی فراخوانی کننده خود اجازه حذف عناصر مجموعه در حین پیمایش را نیز میدهد.
اینترفیس Set
اینترفیس Set در جاوا شامل مجموعهای از عناصر است که هیچ کدام از این عناصر تکراری نیستند. این اینترفیس نشان دهنده یک مفهوم ریاضی است و برای نشان دادن مجموعهها مانند یک دسته کارت مورد استفاده قرار میگیرد. در پلتفرم جاوا ۳ پیادهسازی مهم TreeSet ،HashSet و LinkedHashSet از اینترفیس Set وجود دارد. اینترفیس Set امکان دسترسی تصادفی به عناصر مجموعه خود را نمیدهد. در نتیجه، برای پیمایش عناصر مجموعه باید از حلقه تکرار for each یا iterator استفاده کرد.
اینترفیس List
اینترفیس List یکی دیگر از فرزندان Collection در جاوا است. این اینترفیس شامل مجموعه مرتب شدهای از عناصر است که امکان وجود عنصر تکراری نیز در آن وجود دارد. در اینترفیس List امکان دسترسی به عناصر مجموعه از طریق شماره خانه یا «اندیس» (Index) فراهم است.
لیست یکی از پرکاربردترین نوعهای مجموعه در جاوا است و میتوان آن را به عنوان آرایهای با طول پویا نیز در نظر گرفت. کلاسهای ArrayList و LinkedList از اینترفیس List در جاوا پیادهسازی شدهاند.
متدهای اینترفیس List در جاوا کدامند؟
اینترفیس List متدهای بسیار خوبی را برای افزودن، حذف و جایگزینی عناصر بر اساس شماره خانه یا اندیس آنها فراهم میکند. علاوه بر این، امکان دریافت بخشی از لیست به عنوان زیر مجموعه لیست اصلی بر اساس شماره خانه نیز وجود دارد. در نمونه کد زیر تعدادی از متدهای این اینترفیس آورده شده است.
List strList = new ArrayList();
//add at last
strList.add(0, "0");
//add at specified index
strList.add(1, "1");
//replace
strList.set(1, "2");
//remove
strList.remove("1");
علاوه بر این، کلاسهای Collection در جاوا برای کار با لیستها الگوریتمهای بسیار خوبی همچون Sort ،Shuffle ،reverse ،binarySearch و سایر موارد را فراهم کردهاند.
اینترفیس Queue
«صف» (Queue) یکی دیگر از اینترفیسهای Collection در جاوا است. از این اینترفیس به عنوان مجموعهای جهت نگهداری چندین عنصر قبل از فرایند پردازش استفاده میشود. همچنین، متدهای پایهای مجموعهها برای عملیاتی نظیر درج، استخراج و کنترل صف در این اینترفیس وجود دارد. عناصر موجود درون Queue با استفاده از الگوریتم «اولین ورود، اولین خروج» (First In , First Out | FIFO) مرتبسازی میشوند. بر اساس، الگوریتم FIFO اولین عنصر ورودی به صف، اولین خروجی از صف نیز خواهد بود. به عنوان مثال، میتوان صف خرید بلیط را در نظر گرفت که بر اساس آن اولین نفر در صف زودتر از همه بلیط دریافت میکند. علاوه بر این، امکان تعیین ترتیب عناصر درون صف بر اساس شرایط خاص نیز وجود دارد.
ویژگیهای اصلی Queue چیست؟
با توجه به توضیحات فوق، ویژگیهای اصلی Queue در جاوا را به صورت زیر میتوان فهرست کرد.
- در صفهای مبتنی بر الگوریتم FIFO عناصر جدید به انتهای صف افزوده میشوند.
- در فراخوانی برای حذف یا هر عملیات دیگری عنصر ابتدای صف تحت تاثیر قرار میگیرد.
- درج عنصر در انتهای صف و حذف عنصر از ابتدای صف صورت میپذیرد.
- فرایندهای موجود در کامپیوتر نیز بر اساس صف اولویتبندی و اجرا میشوند.
- امکان تعریف صف برای نوعهای دادهای مختلف نظیر «رشته» (String)، «عدد صحیح» (Inteager) و سایر موارد وجود دارد.
اینترفیس Dequeue در جاوا
اینترفیس Dequeue یکی از زیر مجموعههای اینترفیس Queue در جاوا است. این اینترفیس همانند Queue مجموعهای از عناصر را به صورت صف نگهداری میکند، با این تفاوت که امکان درج و حذف عناصر در هر دو انتهای Dequeue وجود دارد. نام این اینترفیس مخفف عنوان «صف دو طرفه» (double-ended queue | Dequeue) است. بیشتر پیادهسازیهای ارائه شده از این اینترفیس محدودیتی برای تعداد عناصر ندارند. همچنین، این اینترفیس در کنار ارائه متدهایی برای دسترسی به عناصر در هر دو انتهای صف، متدهایی نیز برای عملیات درج، حذف و کنترل عناصر مجموعه را ارائه میدهد.
اینترفیس Map
Map یکی دیگر از اینترفیسهای پرکاربرد فریمورک Collection در جاوا است. این اینترفیس روشی برای ذخیرهسازی و دسترسی به اطلاعات به صورت جفت «کلید-مقدار» (Key-Value) فراهم میکند. محدودیتی برای ذخیرهسازی جفتهای «کلید-مقدار» درون Map در جاوا وجود ندارد، اما کلیدها باید منحصر به فرد و غیرتکراری باشند. همچنین، هر کلید نهایتاً به یک مقدار باید نگاشت شود. کلاسهای LinkedHashMap ،HashMap و TreeMap از اینترفیس Map در جاوا پیادهسازی شدهاند. متدهای put
، get
، containsKey
، containsValue
، size
و isEmpty
برای کار با جفتهای «کلید-مقدار» درون Map در دسترس هستند. پیشتر در مطلب زیر از مجله تم آف مبحث Map در جاوا به صورت کامل مورد بررسی قرار گرفته است.
Map در جاوا چیست ؟ – توضیح مپ به زبان ساده + مثال
اینترفیس ListIterator
اینترفیس ListIterator زیر مجموعه Iterator است و برای پیمایش لیست از هر دو جهت مورد استفاده قرار میگیرد. این اینترفیس برای پردازش دو طرفه لیست علاوه بر متد next
دارای متد previous
نیز است. همچنین، متدهای add
و set
به ترتیب برای افزودن عنصر جدید بعد از عنصر جاری و بروزرسانی عنصر جاری در این اینترفیس مورد استفاده قرار میگیرند.
اینترفیس SortedSet
SortedSet یکی دیگر از اینترفیسهای موجود در فریمورک Collection در جاوا است. مجموعه عناصر موجود در این اینترفیس به ترتیب صعودی مرتب میشوند. علاوه بر این، متدهای مختلفی برای کار با مجموعه عناصر موجود در این اینترفیس در نظر گرفته شده است.
از این اینترفیس برای ذخیرهسازی اطلاعاتی مانند فهرست کلمات یا لیست اعضا استفاده میشود که قابلیت مرتبسازی را دارند.
اینترفیس SortedMap
SortedMap از زیر مجموعههای Map در جاوا است که جفتهای «کلید-مقدار» موجود در آن بر مبنای ترتیب صعودی کلیدها مرتب شدهاند. این اینترفیس شباهتهای بسیاری با SortedSet دارد، با این تفاوت که اطلاعات موجود در SortedMap به صورت جفتهای «کلید-مقدار» ذخیره میشوند. از SortedMap برای ذخیرهسازی اطلاعاتی استفاده میشود که به صورت مجموعهای از جفتهای «کلید-مقدار» هستند. به عنوان مثال، فهرست شماره تلفن و نام اشخاص و همچنین فرهنگ لغات مثالهای خوبی برای SortedMap هستند.
بررسی کلاسهای Collection در جاوا
کلاسهای بسیاری از اینترفیسهای Collection در جاوا پیادهسازی شده است. کلاسهای HashSet ،HashMap و ArrayList رایجترین و پرکاربردترین پیادهسازیهای موجود هستند. در این بخش از نوشته تعدادی از کلاسهای پرکاربرد Collection در جاوا مورد بررسی قرار گرفته است.
کلاس HashSet
کلاس HashSet یکی از کلاسهای پرکاربرد Collection در جاوا است که اینترفیس Set را پیادهسازی میکند. ذخیرهسازی عناصر در این کلاس به کمک جدول Hash صورت میگیرد. در جدول Hash از جفتهای «کلید-مقدار» برای ذخیرهسازی دادهها استفاده میشود. به طور کلی، جدول Hash را میتوان ساختمان دادهای برای ذخیرهسازی و دسترسی به اطلاعات دانست. با توجه به استفاده از جدول Hash برای ذخیرهسازی اطلاعات در کلاس HashSet میتوان ویژگیهای اصلی این کلاس را به صورت زیر خلاصه کرد.
- این کلاس زمان ثابتی را برای انجام عملیاتهای مختلف نظیر درج، حذف و جستجو عناصر ارائه میدهد.
- امکان وجود عناصر تکراری در این کلاس وجود ندارد.
- امکان وجود حداکثر یک عنصر «تهی» (Null) در این کلاس وجود دارد.
- ذخیرهسازی عناصر در کلاس HashSet توسط مکانیزم «درهم سازی» (Hashing) انجام میشود.
- این کلاس تضمینی جهت رعایت ترتیب قرارگیری عناصر ارائه نمیدهد.
کلاس TreeSet
کلاس TreeSet در جاوا یکی از مهمترین پیادهسازیهای اینترفیس SortedSet است که از ساختار درختی برای ذخیرهسازی دادهها استفاده میکند. ترتیب ذخیرهسازی عناصر در کلاس TreeSet بر اساس شرایط در نظر گرفته شده یا ترتیب طبیعی آنها خواهد بود. علاوه بر این، مرتبه اجرایی کلاس TreeSet برای انجام عملیاتهای اصلی نظیر درج، حذف و پیمایش عناصر برابر log(n)
خواهد بود.
کلاس ArrayList
کلاس ArrayList از کلاس AbstractList ارثبری کرده و اینترفیس List در جاوا را پیادهسازی میکند. این کلاس برای ذخیرهسازی عناصر از آرایه پویا استفاده میکند. به طور کلی، ساختار داده آرایه دارای طول مشخصی است و باید در زمان تعریف آرایه طول و تعداد عناصر آن را مشخص کرد. استفاده از آرايه پویا برای ذخیرهسازی در کلاس ArrayList به این معنا است که طول آرایه و تعداد عناصر آن میتواند متغیر باشد. در نتیجه، نیازی به مشخص کردن طول آرایه و تعداد عناصر آن در زمان تعریف نیست. علاوه بر این، امکان ذخیرهسازی عناصر تکراری در این ساختار نیز وجود دارد.
چگونه از ArrayList در جاوا استفاده کنیم؟
کلاس LinkedList
کلاس LinkedList در جاوا از کلاس AbstractList ارثبری کرده و اینترفیسهای List و Dequeue را پیادهسازی میکند. ذخیرهسازی عناصر در این کلاس توسط «لیست پیوندی دو طرفه» (Doubly-Linked List) صورت میگیرد که نوعی ساختار داده خطی است. در این ساختار داده عناصر در مکانهای متوالی و پشت سر هم ذخیره نمیشوند. در عوض، هر عنصر در این ساختار یک شی جداگانه در نظر گرفته میشود که شامل دو بخش داده و آدرس است. بخش آدرس برای پیوند دادن هر عنصر به عنصر بعدی مورد استفاده قرار میگیرد. علاوه بر این، تمام عملیاتهای موجود در لیست پیوندی برای کلاس LinkedList نیز قابل اجرا است.
کلاس HashMap
کلاس HashMap یکی از پیادهسازی اینترفیس Map در جاوا است که اینترفیس Map نیز خود بخشی از فریمورک Collection در جاوا محسوب میشود. اطلاعات درون HashMap به صورت جفتهای «کلید-مقدار» ذخیره میشوند. کلیدها در این ساختار منحصر به فرد هستند و امکان استفاده از کلیدهای تکراری وجود ندارد. در نتیجه، هر کلید به مقدار مشخصی در این ساختار اشاره دارد.
این کلاس برای ذخیرهسازی اطلاعات از مکانیزم جدول Hash استفاده میکند، ولی ذخیرهسازی اطلاعات به صورت «غیرهمگام» (Unsynchronised) است و از ترتیب مشخصی نیز پیروی نمیکند. علاوه بر این، در این ساختار امکان استفاده از کلیدهای «تهی» (Null) نیز وجود دارد، اما تنها از یک کلید تهی میتوان استفاده کرد.
کلاس TreeMap
یکی دیگر از کلاسهای فریمورک Collection در جاوا کلاس TreeMap است. این کلاس از اینترفیس SortedMap پیادهسازی شده است. ساختار داده «درخت سیاه-قرمز» (Red-Black Tree) اساس و پایه این کلاس را تشکیل میدهد و عناصر موجود در آن بر اساس ترتیب طبیعی کلیدها یا شرایط تعیین شده در زمان ایجاد مرتب میشوند.
مرتبه اجرایی این کلاس برای انجام عملیات اصلی نظیر درج، حذف و پیمایش عناصر برابر مقدار log(n) است. همچنین، ذکر این نکته ضروری است که این کلاس ضمن رعایت ترتیب صعودی ذخیرهسازی، اطلاعات را به صورت غیرهمگام ذخیره میکند.
کلاس PriorityQueue
پردازش عناصر درون صف یا Queue بر مبنای الگوریتم FIFO است. بر اساس این الگوریتم اولین ورودی به صف، اولین خروجی از صف نیز خواهد بود. گاهی اوقات نیاز است تا عناصر درون صف به جای الگوریتم FIFO بر اساس اولویت پردازش شوند. برای این منظور میتوان از کلاس PriorityQueue به همراه تعیین شرط در حین نمونهسازی استفاده کرد. ذکر این نکته نیز ضروری است که امکان استفاده از مقادیر تهی در این کلاس وجود ندارد.
الگوریتمهای Collection در جاوا
کارکرد اصلی فریمورک Collection در جاوا به همراه تمام اینترفیسها و کلاسهای زیر مجموعهاش ارائه ساختارهای متفاوت و کارآمد برای ذخیرهسازی دادههایی با ویژگیهای مختلف است.
در گام بعدی برای پردازش دادهها و رسیدن به نتیجه نیاز به پیادهسازی عملیاتهای مختلف بر روی دادهها وجود دارد. برای همین منظور الگوریتمهای مختلفی برای پیادهسازی عملیات رایج نظیر مرتبسازی و جستجو بر روی مجموعهها ارائه شده است. کلاسهای Collection در جاوا از این الگوریتمها پشتیبانی میکنند. هر چند بیشتر این الگوریتمها برای کار با لیستها توسعه داده شدهاند، اما تعدادی از آنها جنبه عمومی داشته و بر روی انواع مجموعهها قابل پیادهسازی هستند. در ادامه، به این سوال پاسخ داده شده است که مهمترین الگوریتمهای Collection در جاوا چیست و چه کاربردی دارند.
الگوریتم های مرتب سازی فریمورک Collection در جاوا
الگوریتمهای «مرتب سازی» (Sorting) عناصر موجود در لیست را مرتب میکنند تا این عناصر بر اساس ترتیب طبیعی خود به صورت صعودی قرار گیرند.
الگوریتمهای Sorting دارای ۲ شکل اصلی هستند. حالت اول یا شکل ساده این الگوریتم یک لیست را به عنوان ورودی دریافت میکند و آن را بر اساس ترتیب طبیعی عناصر تشکیل دهندهاش مرتب میسازد. در حالت دوم اما الگوریتم علاوه بر لیست مورد نظر یک «مقایسه کننده» نیز به عنوان ورودی دریافت میکند و مرتبسازی عناصر موجود در لیست به کمک مقایسه کننده صورت میگیرد.
انواع الگوریتم های مرتب سازی
به دلیل انعطافپذیری جاوا این زبان برنامه نویسی از انواع الگوریتمهای مرتبسازی پشتیبانی میکند. بنابراین، امکان استفاده از این الگوریتمها در فریمورک Collection به عنوان بخشی از زبان برنامه نویسی جاوا نیز وجود دارد. الگوریتمهای مرتبسازی موجود در جاوا بسیار انعطافپذیر هستند و امکان پیادهسازی آنها هم با «رویههای بازگشتی» (Recursive Procedures) و هم با «روشهای تکرار شونده» (Iterative Method) وجود دارد. در ادامه، ۶ مورد از محبوبترین و پرکاربردترین الگوریتمهای مرتبسازی موجود در جاوا آورده شده است.
- الگوریتم «مرتبسازی حبابی» (Bubble Sort)
- الگوریتم «مرتبسازی ادغامی» (Merge Sort)
- الگوریتم «مرتبسازی انتخابی» (Selection Sort)
- الگوریتم «مرتبسازی درجی» (Insertion Sort)
- الگوریتم «مرتبسازی سریع» (Quick Sort)
- الگوریتم «مرتبسازی هرمی» (Heap Sort)
معرفی تکنیک های مرتب سازی (Sorting Techniques) — ساختار داده و الگوریتم ها
الگوریتم Shuffling
الگوریتم Shuffling به لحاظ عملکرد در نقطه مقابل الگوریتم Sorting قرار میگیرد. این الگوریتم هر گونه نظم و ترتیب احتمالی موجود در بین عناصر لیست را از بین میبرد. این الگوریتم به صورت کاملاً تصادفی فهرستی از عناصر لیست را دریافت میکند و مجدداً مکان این عناصر را در لیست تغییر میدهد. از این الگوریتم در پیادهسازی بازیهای مبتنی بر شانس استفاده میشود.
الگوریتمهای جستجو در فریمورک Collection در جاوا
در پاسخ به سوال پرکاربردترین الگوریتم Collection در جاوا چیست میتوان به الگوریتم Searching اشاره کرد. از الگوریتم Searching برای جستجو یک عنصر مشخص در بین مجموعهای از عناصر استفاده میشود.
الگوریتمهای مختلفی برای جستجو در مجموعهها وجود دارد که بهترین آنها الگوریتم «جستجوی دودویی» (binarySearch) است. این الگوریتم قابلیت پیادهسازی به ۲ صورت را دارد. در حالت اول یا شکل ساده جستجو، یک لیست به همراه عنصر مورد نظر برای جستجو یا اصطلاحاً «کلید جستجو» (Search Key) به الگوریتم داده میشود. در این حالت فرض بر این است که عناصر موجود در لیست به صورت صعودی مرتب شدهاند. شکل دوم این الگوریتم نیز علاوه بر لیست و کلید جستجو یک مقایسه کننده نیز دارد که در این حالت عناصر موجود در لیست با توجه به مقایسه کننده به ترتیب صعودی مرتب شدهاند. قبل از فراخوانی الگوریتم Searching میتوان از الگوریتم Sorting برای مرتبسازی لیست استفاده کرد.
الگوریتم های ترکیب
الگوریتمهای «ترکیب» (Composition) در جاوا برای بررسی برخی از ویژگیهای ترکیب یک یا چند مجموعه مورد استفاده قرار میگیرند. از جمله پرکاربردترین الگوریتمهای ترکیب میتوان به الگوریتم frequency و disjoint اشاره کرد. در ادامه، کاربرد هر کدام از این دو الگوریتم آورده شده است.
- الگوریتم frequency: این الگوریتم تعداد دفعات تکرار یک عنصر را در مجموعه مشخص شده محاسبه میکند.
- الگوریتم disjoint: از این الگوریتم برای تشخیص جدا بودن دو مجموعه از هم استفاده میشود. اگر دو مجموعه هیچ عنصر مشترکی نداشته باشند، آنگاه جدا از هم نامیده میشوند.
الگوریتم های Min و Max
الگوریتمهای Min و Max به ترتیب برای به دست آوردن کمترین و بیشترین مقدار درون یک مجموعه مشخص مورد استفاده قرار میگیرند. نحوه کار این دو الگوریتم بسیار ساده است. در هر دو الگوریتم مجموعهای از عناصر به عنوان ورودی مشخص میشوند و خروجی الگوریتم نیز کمترین یا بیشترین مقدار موجود در این مجموعه خواهد بود.
سوالات متداول
در ابتدای نوشته فریمورک Collection در جاوا و عناصر اصلی آن به طور کامل مورد بررسی قرار گرفتند. بر همین اساس، برای تکمیل مباحث موجود در این حوزه سعی شده است تا در این بخش به پرتکرارترین و متداولترین سوالات مرتبط با Collection در جاوا پاسخ داده شود.
اینترفیس List و Set در جاوا چه تفاوتی با هم دارند؟
اینترفیس List در جاوا شامل مجموعه مرتبشدهای از عناصر است که امکان وجود یا عدم وجود عناصر تکراری را دارد. در نقطه مقابل، اینترفیس Set در جاوا مجموعهای از عناصر را شامل میشود که از ترتیب خاصی برخوردار نیستند. علاوه بر این، مقادیر موجود در Set باید منحصر به فرد و غیرتکراری باشند.
کلاسهای HashMap و TreeMap در جاوا چه تفاوتی با هم دارند؟
در کلاس HashMap استفاده از تنها یک کلید تهی و چندین مقدار تهی امکانپذیر است. کلاس TreeMap امکان استفاده از کلیدهای تهی را نمیدهد، اما استفاده از چندین مقدار تهی در این کلاس امکانپذیر است. علاوه بر این، در کلاس HashMap امکان استفاده از عناصر با نوعهای دادهای مختلف وجود دارد، زیرا این کلاس عملیات مرتبسازی را انجام نمیدهد. در نقطه مقابل، کلاس TreeMap تنها عناصری با نوع دادهای یکسان را به عنوان کلید میپذیرد، زیرا این کلاس مرتبسازی عناصر را بر مبنای کلیدها انجام می دهد.
بهترین کلاس Collection در جاوا چیست؟
کلاسها و اینترفیسهای مختلفی از فریمورک Collection پیادهسازی شده است و هر کدام کارکرد مخصوص به خود را دارند. به عنوان مثال، کلاس ArrayList برای افزودن و حذف عناصر به انتهای لیست مورد استفاده قرار میگیرد. همچنین، این کلاس گزینه مناسبی برای دسترسی تصادفی به عناصر است. در نقطه مقابل، این کلاس برای اضافه کردن و حذف عناصر در موقعیت دلخواه عملکرد بسیار ضعیفی را ارائه میدهد. با این وجود، کلاس LinkedList در جاوا گزینه بسیار خوبی برای افزودن و حذف عناصر در موقعیتهای دلخواه است. در نهایت، میتوان این گونه استنباط کرد که با توجه به عملکرد مورد نیاز باید از کلاس مناسب در ساختار Collection استفاده کرد.
آیا آرایهها بخشی از فریمورک Collection در جاوا هستند؟
خیر، آرایهها ساختار داده متفاوتی هستند و زیر مجموعه فریمورک Collection در جاوا محسوب نمیشوند. طول آرایه ثابت است و بعد از تعریف آرایه امکان افزودن عنصر جدید یا حذف عناصر قدیمی از آن وجود ندارد. در نقطه مقابل، Collection از نظر اندازه پویا است و با توجه به نیاز برنامه میتوان عنصر جدیدی را به آن اضافه یا عناصر قبلی را از آن حذف کرد.
منظور از اینترفیس در جاوا چیست؟
زبان برنامه نویسی جاوا از «وراثت چندگانه» (Multiple Inheritance) پشتیبانی نمیکند. در نتیجه، کلاسها در این زبان نمیتوانند بیش از یک کلاس را در یک نمونه مشخص بسط دهند. برای حل این مشکل اینترفیسها در این زبان ایجاد شدند. علاوه بر این، اینترفیسها در زبان جاوا با کاهش پیچیدگی کدها منجر به بهبود «خوانایی» (Readability) و سادگی برنامه میشوند.
اینترفیس در جاوا چیست؟ — مفهوم، کاربرد و پیاده سازی Java Interface
جمعبندی
کار با دادههای مختلف و استفاده از آنها یکی از بخشهای جدایی ناپذیر فرایند توسعه است. با توجه به شرایط و نیازمندیهای برنامه گاهی اوقات باید چندین عنصر را به صورت مجموعه ذخیره کرد. در زبان برنامه نویسی جاوا برای ذخیره مجموعهای از عناصر ساختاری تحت عنوان Collection معرفی شده است. فریمورک Collection در جاوا علاوه بر ارائه راهکارهای متنوع برای ذخیرهسازی مجموعهها متدهای مختلفی را نیز برای پیادهسازی عملیاتی همچون جستجو، مرتبسازی و پیمایش دادهها فراهم میکند.
بر همین اساس در این مطلب از مجله تم آف به این سوال پاسخ داده شد که فریمورک Collection در جاوا چیست و چه کاربردی دارد. علاوه بر این، ضمن بررسی سلسله مراتب موجود در این فریمورک انواع کلاسها و اینترفیسهای پیادهسازی شده از آن نیز مورد بررسی قرار گرفتند. در ادامه نیز ضمن بررسی انواع الگوریتمهای موجود در این فریمورک، مزایای استفاده از Collection در برنامه نویسی بیان شد.