آموزش جاوامقالات

کلکسیون ها در جاوا- درس اول: آشنایی با کلکسیون ها (Java Collections)

کلکسیون ها در جاوا چه چیزی هستند؟  

کلکسیون (به انگلیسی: Collection) به معنای مجموعه است. وکلکسیون ها در جاوا هم همان کاربرد مجموعه را دارد.

به اینطور چیزها، ساختمان داده (به انگلیسی: Data Structure) می گویند و البته واضح است که ارتباطی به ساختمانی که در آن می دهند ندارد! اگر معنی ساختمان داده را نمی دانید این صفحه را ببینید: ساختمان داده در ویکی پدیا 

در واقع کلکسیون ها شبیه آرایه ها هستند. مثل آرایه ها، مجموعه ای از چیزها را داخل خودشان نگه می دارند.

کلکسیون ها در جاوا چه چیزهایی داخل خودشان نگه می دارند؟ 

کلکسیون ها در جاوا ارجاع اشیاء دیگر را داخل خود نگه می دارند. یعنی متغیر های نوع مرجع (به انگلیسی: Reference data type) را در خود نگه می دارند. و توانایی نگهداری متغیر های نوع اولیه (Primitive data type) را ندارند.

در حالی که آرایه ها، هم متغیرهای نوع مرجع (به انگلیسی: Reference data Type)  و هم متغیر های نوع اولیه (Primitive data type) را می توانند در خود ذخیره کنند.

پس یعنی نمی شود متغیرهای int و double و سایر انواع اولیه را داخل کلکسیون های جاوا ریخت؟

پاسخ سریع: چرا، می شود. اما راه دارد: استفاده از روکش!

کلاس روکش کننده (یا کلاس لفاف یا کلاس جلدکننده) چیست؟

کلاس روکش کننده (به انگلیسی: type wrapper classes) کلاس هایی هستند که یک نوع داده اولیه را به یک شئ تبدیل می کنند.

wrapper

به ازای هر کدام از انواع داده اولیه، یک کلاس روکش کننده منتاظر وجود دارد که در جدول زیر می بینید:

نوع اولیه (primitive data type)کلاس روکش کننده (type wrapper class)
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean
جدول انواع داده اولیه و کلاس روکش کننده متناظر آنها

قالب گیری و از از قالب درآوری (ناقالب گیری) کلاس های روکش کننده در جاوا

جاوا به صورت اتوماتیک، تبدیل بین کلاس های روکش کننده و انواع اولیه منتاظر با آنها را انجام می دهد.

به این کارها auto-boxing (قالب گیری اتوماتیک) و auto-unboxing (از قالب درآوردن اتوماتیک) می گویند.

مثال auto-boxing :

Integer[] myIntegerArray = new Integer[4];
myIntegerArray[0] = 5; 

در کد بالا می بینید که ما عدد 5 را که از نوع اولیه int میباشد، به صورت مستقیم داخل یک آرایه از نوع کلاس روکش کننده Integer ریختیم. و جاوا بجای اینکه از ما خطا بگیرد، خودش این داده int را به نوع Integer تبدیل می کند.

به این کار جاوا، auto-boxing می گویند

مثال auto-unboxing :

Integer[] myIntegerArray = new Integer[4];
myIntegerArray[0] = 5; 
int value = myIntegerArray[0];

در کد بالا می بینید که در خط سوم برنامه، مقدار اندیس صفرم آرایه ای از نوع کلاس روکش کننده Ineteger داخل متغیری از نوع اولیه int ریخته میشود. و جاوا بجای اینکه از ما خطا بگیرد، خودش این داده Integer را به نوع int تبدیل می کند.

به این کار جاوا، auto-unboxing می گویند

انواع کلکسیون ها در جاوا

انواع مختلفی از کلکسیون ها در جاوا وجود دارند که همگی واسط (به انگلیسی: Interface) کلکسیون را پیاده سازی کرده اند. (مفهوم پیاده سازی اینترفیس ها را می توانید معادل ارث بری در نظر بگیرید)

کلکسیون ها در جاوا به سه دسته اصلی تقسیم می شوند:

1- لیست (به انگلیسی: List) : یک کلکسیون مرتب که میتواند عناصر تکراری هم داشته باشد.

2- صف (به انگلیسی: Queue): یک کلکسیون با منطق “اونی که اول اومده اول هم میره” یا “دیر اومدی نخواه زود برو” (به انگلیسی: First-in First-out)

3- مجموعه (به انگلیسی: Set): یک کلکسیون که عناصر تکراری قبول نمی کند.

هر کدام از این سه دسته، یک واسط (اینترفیس) هستند که از واسط کلکسیون مشتق شده اند.

در چارت زیر انواع کلکسیون های جاوا را مشاهده می کنید:

سلسله مراتب کلکسیون ها در جاوا

4- مپ (به انگلیسی: Map) : واسط مپ یک نوع کلکسیون است که از واسط کلکسیون جاوا مشتق نشده است. اما این چیزی از ارزشهایش کم نمی کند! سر فرصت واسط map در جاوا را هم برایتان توضیح خواهم داد.

کلکسیون های جنریک (به انگلیسی: Generic collections)   

جنریک یعنی چه ؟ یعنی عمومی.

پس کلکسیون جنریک چه معنی می دهد؟ معنی اش میشود مجموعه عمومی.

یعنی کلکسیونی که به صورت پیشفرض نوع مشخصی ندارد و در زمان تعریف، میتوانیم هر نوع شئ را بعنوان نوع آن کلکسیون تعریف کنیم.

اگر گیج شدین، این مثال رو ببینید:

مثلا List  یکی از کلکسیون ها است. لیست به صورت پیشفرض هیچ نوع خاصی ندارد. یعنی معلوم نیست که چه نوع داده ای داخل آن ریخته می شود. در زمانی که میخواهیم لیست را ایجاد کنیم، نوع داده داخل آن را بوسیله آرگومان نوع (به انگلیسی: type argument) مشخص می کنیم :

تعریف یک لیست از نوع استرینگ:

List<String> list = new List<String>();

تعریف یک لیست از نوع اینتیجر:

List<Integer> list = new List<Integer>();

تعریف یک لیست از نوع Person :

List<Person> list = new List<Person>();

دیدین؟ لیست به خودی خود نوع خاصی ندارد. بلکه در زمان تعریف، نوع آن را مشخص می کنیم. به همین دلیل به ساختمان داده هایی که اینجوری هستند، نوع عمومی یا جنریک می گویند. به کلکسیون هایی هم که به صورت عمومی هستند (و به صورت پیشفرض نوع دیتای خاصی ندارند) کلکسیون جنریک گفته میشود.

کلاس Collections در جاوا و تفاوت آن با واسط Collection و سلاح های مخفی و پرقدرت آنها

نگذارید اسمهایشان گولتان بزند! (به حرف S که موزیانه آخر اسم کلاس collections مخفی شده دقت کنید)

همانطور که یخورده بالاتر در چارت اینترفیس Collection جاوا دیدید، واسط Collection از واسط Iterable پیاده سازی شده است.

اما Collections نه تنها واسط نیست و کلاس است، بلکه مستقیماً از کلاس Object جاوا ارث بری می کند.

پس حواستان باشد این دوتا را با هم قاطی نکنید. مخصوصاً مواقعی که میخواهید سعی کنید از متدهای آنها استفاده کنید.

واسط Collection تا آنجا که من میدانم، 19 متد دارد (در جاوا نسخه 8) و در یک مطلب مفصل، این 19 متد را با شرح و مثال سالاد و مخلفات برایتان توضیح خواهم داد.

کلاس Collections هم حدود 60 متد دارد (آن هم در جاوا 8) و کاربردی ترین این متدها (که غالباً از نوع static هستند و درجا میشود ازشان استفاده کرد) را هم در یک مطلب پر از مثال و خرت و پرت برایتان کالبد شکافی کرده ام:‌ کلکسیون ها در جاوا- درس سوم: آشنایی با متدهای کاربردی کلاس Collections

لیست، صف و مجموعه درجاوا

سه واسط پیاده سازی شده از کلکسیون در جاوا هر کدام توانایی ها و راز و رمزهای خودشان را دارند. آنها را هم هر کدام به صورت جدا در مطالب مربوط به خودشان بررسی خواهم کرد و با شرح و مثال و چیپس و ماست برایتان توضیح خواهم داد.

واسط لیست در جاوا: کلکسیون ها در جاوا- درس دوم: انواع لیست در جاوا

برچسب ها

حامد عسکریان

برنامه نویس و عاشق تکنولوژی

دیدگاهتان را بنویسید

دکمه بازگشت به بالا
بستن
بستن