
کلکسیون ها در جاوا- درس دوم: انواع لیست در جاوا
فهرست مطالب:
آشنایی با واسط لیست در جاوا
لیست در جاوا یک نوع کلکسیونه که که این ویژگی ها رو داره :
- لیست یک کلکسیون مرتب هست. یعنی آیتم های آن دارای اندیس هستند و بهم ریخته نیست. (از این نظر شبیه آرایه است)
- لیست می تواند آیتم های تکراری هم داشته باشد.
- اندیس آیتم های لیست از صفر شروع می شود. (از این نظر هم شبیه آرایه است)
- لیست یک واسط (Interface) هست و از واسط Collection جاوا ارث بری می کند.
- کلاسهای ArrayList و LinkedList و Vector از واسط لیست ارث بری می کنند.
برای آشنایی با واسط کلکسیون در جاوا، حتما این مطلب رو بخونید.
متد های واسط List در جاوا
واسط لیست، علاوه بر متدهایی که از واسط Collection به ارث می برد، خودش نیز متدهایی برای کار با آیتم های لیست دارد.
توضیحات | نوع بازگشتی | متد |
یک آیتم مشخص را در یک اندیس مشخص از لیست جایگذاری می کند | void | add(int index, E element) |
یک آیتم مشخص را به انتهای لیست اضافه می کند | boolean | add(E e) |
تمام آیتم های یک کلکسیون را به انتهای لیست اضافه می کند | boolean | addAll(Collection<E> c) |
تمام آیتم های یک کلکسیون را به لیست اضافه می کند. اضافه کردن را از اندیس مشخص شده ی لیست آغاز می کند. | boolean | addAll(int index, Collection<E> c) |
تمام آیتم های لیست را حذف می کند. | void | ()clear |
یک شئ را با آیتم های لیست مقایسه می کند | boolean | equals(Object o) |
مقدار هش شده لیست را به صورت عددی بر می گرداند | int | ()hashcode |
شیئی که در اندیس مورد نظر لیست وجود دارد را بر می گرداند | از نوع شئ داخل لیست | get(int index) |
اگر لیست خالی باشد True بر می گرداند و بالعکس | boolean | ()isEmpty |
اولین اندیس یک آیتم در لیست را بر می گرداند.(فرض کنید از یک آیتم چندتا در لیست موجود باشد) اگر شئ در لیست موجود نباشد عدد (1-) بر می گرداند | int | indexOf(Object o) |
آخرین اندیس یک آیتم در لیست را بر می گرداند.(فرض کنید از یک آیتم چندتا در لیست موجود باشد) اگر شئ در لیست موجود نباشد عدد (1-) بر می گرداند | int | lastIndexOf(Object o) |
تمام آیتم های لیست را با حفظ ترتیب، به صورت آرایه ای از Object ها بر می گرداند. | [ ]Object | ()toArray |
تمام آیتم های لیست را با حفظ ترتیب، به صورت آرایه ای از نوع آرایه پاس داده شده بر می گرداند. | [ ] T | toArray(T[] a) |
اگر آیتم مورد نظر در لیست موجود باشد، Trueبر می گرداند | boolean | contains(Object o) |
اگر تمام آیتم های کلکسیون مورد نظر در لیست موجو باشد، True بر می گرداند | boolean | containsAll(Collection<?> c) |
یک اندیس می گیرد و آیتمی که در آن اندیس وجود دارد را حذف می کند | E | remove(int index) |
نام آیتم را می گیرد و اولین آیتمی که با آن نام در لیست وجود دارد را حذف می کند. | boolean | remove(Object o) |
یک کلکسیون می گیرد و تمام اعضای داخل آن را از داخل لیست حذف می کند | boolean | removeAll(Collection<?> c) |
تمام آیتم های لیست را با آیتم ورودی تعویض می کند | boolean | replaceAll(UnaryOperator<E> operator) |
یک کلکسیون می گیرد و تمام آیتم های لیست را که در کلکسیون موجود نباشد، حذف می کند | void | retainAll(Collection<?> c) |
یک آیتم و یک اندیس می گیرد. سپس آیتم موجود در آن اندیس را با آیتم ورودی جایگزین می کند | E | set(int index, E element) |
یک شئ از نوع Comparator می گیرد و لیست را بر اساس آن مرتب می کند | void | sort(Comparator<? super E> c) |
دو ایندکس شروع و پایان را می گیرد و یک لیست جدید در این رنج بر می گرداند | <List<E | subList(int fromIndex, int toIndex) |
تعداد آیتم های لیست را شمرده و بر می گرداند. | int | ()size |
انوع لیست در جاوا
1- کلاس ArrayList
کلاس ArrayList یک نوع لیست در جاوا است که واسط List رو پیاده سازی کرده.
در ArrayList امکان درج یا حذف یک آیتم از میانه لیست امکانپذیره. اما اصلاً بهینه نیست. بخاطر اینکه برای درج یا حذف آیتم از داخل لیست، تمام عناصر قبل و یا بعد از اون باید یکی یکی تغییر مکان بدن. این کار در لیست های بزرگ واقعا وقت گیره.
یک نمونه کد ArrayList را در زیر با هم می بینیم:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MainClass { public static void main(String[] args) { List<Integer> myList = new ArrayList<>(); myList.add(3); myList.add(8); myList.add(6); myList.add(4); myList.add(2); } }
نکته بسیار مهم: در کد بالا می بینید که یک متغیر از نوع List ساخته ایم. و ارجاع ArrayList را درون آن ریخته ایم.
چرا یک متغیر از نوع خود ArrayList نساختیم؟
به دلیل رعایت مهندسی نرم افزار. در این حالت اگر بعداً به این نتیجه برسیم که بجای ArrayListمیبایست از LinkedListاستفاده می کردیم، فقط کافی است یک خط دستور را عوض کنیم. (همان خطی که ArrayList را ایجاد کرده ایم) و چون در بقیه برنامه با یک متغیر از نوع List کار کرده ایم دیگر نیازی به تغییر بقیه کد نخواهد بود.
در کل یادتون باشه هر وقت یک شئ کلکسیون ساختید، ارجاعش رو از نوع واسط کلکسیون مورد نظر قرار بدید!
2- کلاس LinkedList در جاوا
کلاس LinkedList یا لیست پیوندی در جاوا (که توی درس برنامه نویسی پیشرفته دانشگاه، استاد با نسخه ++C اش دهنمونو صاف کرده بود) یکی دیگه از کلاسهاییه که واسط لیست رو پیاده سازی می کنه.
توی لیست پیوندی، هر آیتم آدرس آیتم بعدی رو نگه میداره . به همین دلیل حذف و اضافه از داخل لیست پیوندی، نیازمند جابجایی بقیه عناصر نیست.
به همین دلیل حذف و اضافه کردن آیتم ها در لیست پیوندی خیلی بهینه تر از ArrayList هستش.
اما چون هر کدوم از آیتم ها آدرس مشخصی ندارن (آدرسشون رو از آیتم قبلی می گیرن) رفتن به یک آیتم خاص در لیست پیوندی بسیار ناکارآمد تر از ArrayList خواهد بود.
در کد زیر یک لیست پیوندی ایجاد کردیم و چندتا آیتم بهش اضافه کردیم :
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MainClass { public static void main(String[] args) { List<Integer> myList = new LinkedList<>(); myList.add(3); myList.add(8); myList.add(6); myList.add(4); myList.add(2); } }
کلاس Iterator در جاوا
iterator که معنی لغوی آن «تکرارکننده» هست در واقع یک دیزاین پترن است.
این دیزاین پترن در جاوا به صورت یک کلاس تعریف شده. و به صورت java.util.Iterator قابل import کردن در برنامه است.
کلاً یک Iterator به درد پیمایش در کلکسیون ها می خورد. Iterator دو متد hasNext , next دارد که بوسیله آنها می تواند وضعیت رکورد بعدی کلکسیون را بفهمد.
در حقیقت همیشه Iterator می تواند به ما بگوید که لیست تمام شده یا هنوز مقدار بعدی دارد. و به همین روش به صورت یک لوپ روی کلکسیون ما پیمایش می کند.
کلکسیون ها هم یک متد به نام iterator دارند. از این متد شئ ساخته شده از کلاس Iterator را در ابتدای لیست قرار می دهد. در حقیقت شئ ساخته شده از Iterator را روی کلکسیون، و در ابتدای کلکسیون نصب می کند.
اینجا را ببینید.
مثلاً فرض کنید ما یک ArrayList میسازیم و برند های گوشی تلفن همراه را داخل آن میریزیم. حالا بوسیله یک Iterator می توانیم داخل این لیست پیمایش کنیم.
مثال زیر رو ببینید
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MainClass { public static void main(String[] args) { List<String> myList = new ArrayList<>(); myList.add("Xiaomy"); myList.add("Apple"); myList.add("Samsung"); myList.add("Nokia"); myList.add("Huawei"); //using iterator(); Method for Get Iterator from Collection Iterator<String> mtIterator = myList.iterator(); //Looping through a Collection while (mtIterator.hasNext()){ System.out.println(mtIterator.next()); } } }
خروجی کد بالا به صورت زیر خواهد بود:
Xiaomy Apple Samsung Nokia Huawei Process finished with exit code 0
حذف آیتم های لیست بوسیله Iterator
چون iterator توانایی پیمایش در کلکسیون ها را دارد، از آن برای جستجو و حذف آیتم های نا-دلخواه نیز استفاده می شود.
در مثال زیر ما به کمک یک بلوک if که درون Iterator قرار داده ایم، تمام اعداد کوچکتر از ۵ را از لیست حذف کرده ایم:
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class MainClass { public static void main(String[] args) { List<Integer> myList = new ArrayList<>(); myList.add(3); myList.add(8); myList.add(6); myList.add(4); myList.add(2); //using iterator(); Method for Get Iterator from Collection Iterator<Integer> myIterator = myList.iterator(); //Looping through a Collection while (myIterator.hasNext()){ Integer number = myIterator.next(); if (number < 5 ){ myIterator.remove(); } } System.out.println(myList); } }