آموزش ArrayList و List در جاوا، جامع و کاربردی
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش جامع List و ArrayList در جاوا
در جلسه گذشته متدهای مشترک بین کالکشن ها را توضیح دادیم و در این جلسه میخواهیم ساختار List و ArrayList را بررسی کنیم.
List ها امکان ذخیره سازی هر نوع داده ای را به ما میدهند که 4 کلاس ArrayList, LinkedList, Vector, Stack میباشد.
کلاس ArrayList و Vector بر اساس آرایه ها ساخته شدهاند یعنی عناصر آنها مانند آرایهها شماره گذاری میشوند. در هنگام تعریف ArrayList و Vector یک آرایه با 128 خانه در حافظه ساخته میشود.
ArrayList: در ArrayList اگر تعداد عناصر بیشتر از 128 شود، 50 درصد سایز فعلی ArrayList را به آن اضافه میکند. به عنوان مثال 50 درصد سایز 128 برابر 64 را به سایز ArrayList اضافه میکند.
Vector: در Vector ها اگر تعداد عناصر بیشتر از 128 شود، سایز فعلی 2 برابر میشود به عنوان مثال اگر در ابتدا سایز Vector برابر 128 خانه باشد و با اضافه کردن عنصر 129 سایز Vector برابر 256 و در سری بعد برابر 512 میشود. یکی دیگر از امکانات Vector قابلیت چند نخی است که درون خود پیاده سازی کرده و اجازه میدهند چندین Thread به صورت همزمان دسترسی داشته باشند. و اگر نیازمند به دادهها و فضای امن هستید بهتر از ArrayList استفاده کنید.
LinkedList: بر اساس لیست پیوندی ساخته شده است. یعنی هنگام ذخیره سازی، داده ها در کنار هم دیگر نیستند و حافظه پخش شده هستند.
شاید بپرسید از کدام نوع استفاده کنیم؟
در پاسخ به این سوال باید گفت بستگی به شرایط و نیازی که درون پروژه هست باید از هر کدام استفاده کرد. به عنوان مثال زمانی که مدام به واکشی اطاعات نیاز دارید استفاده از ArrayList و Vector سرعت و کارایی بیشتری دارد. و اگر به درج و حذف مدام داده در وسط لیست نیاز دارید بهترین گزینه LinkedList است که سرعت و کارایی بیشتری دارد.
Stack: که به صورت LIFO معرفی میشوند، رفتاری برعکس Queue(صف) دارند. یعنی آخرین داده ای که وارد می شود اولین داده ای است که خارج میشود.
توابع مشترک بین List
همانطور که در بالا توضیح دادیم سایز پیش فرض List ها 128 واحد است و با بیشتر شدن عناصر از 128 واحد، سایز لیست افزایش مییابد عملیات افزایش سایز لیست پشت پرده انجام میشوند و ما هیچ چیز مشاهده نمیکنیم اما انجام این عملیات کمی زمان بر است و اگر از سایز لیست مطلع هستید میتوانید در تابع سازنده لیستها مقدار پیش فرض حافظه را وارد کنید.
در پایین سایز پیش فرض ArrayList برابر با 500000
List<String> list2=new ArrayList<>(500000);
متد get
این متد شماره خانه را دریافت میکند و مقدار آن را برمیگرداند.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("reza");
System.out.println(list1.get(1));
خروجی
reza
متد set
این متد دو ورودی دریافت میکند و مقدار یک خانه از لیست را تغییر میدهد. ورودی اول شماره خانه مقصد و ورودی دوم مقدار جدید است.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("reza");
list1.set(1,"aaaaaaaaaa");
System.out.println(list1.get(1));
خروجی
aaaaaaaaaa
متد indexOf
این متد یک مقدار را دریافت میکند و از ابتدای لیست جستجو میکند و شماره خانه آن مقدار درون لیست را برمیگرداند. اگر مقدار وارد شده درون لیست نباشد عدد -1 را برمیگرداند.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("ahmad");
list1.add("mohammad");
list1.add("ahmad");
list1.add("negin");
System.out.println(list1.indexOf("ahmad"));
خروجی
1
متد lastIndexOf
این متد یک مقدار دریافت میکند و از انتهای لیست جستجو میکند و شماره خانه آن مقدار درون لیست را برمیگرداند. اگر مقدار وارد شده درون لیست نباشد عدد -1 برمیگرداند.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("ahmad");
list1.add("mohammad");
list1.add("ahmad");
list1.add("negin");
System.out.println(list1. lastIndexOf ("ahmad"));
خروجی
3
متد subList
این متد برای کپی کردن بخشی از یک لیست استفاده میشود و نقطه ابتدا و انتهای را دریافت میکند و یک لیست به عنوان خروجی برمیگرداند.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("ahmad");
list1.add("mohammad");
list1.add("negin");
list1.add("zahra");
System.out.println(list1.subList(2,5));
خروجی
[mohammad, negin, zahra]
متد sort
این متد برای مرتب سازی لیست استفاده میشود و یک ورودی از نوع Comparator دریافت میکند.
Comparator.naturalOrder(): مرتب سازی صعودی
Comparator.reverseOrder(): مرتب سازی نزولی
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("ahmad");
list1.add("mohammad");
list1.add("negin");
list1.add("zahra");
list1.sort(Comparator.reverseOrder());
System.out.println(list1);
خروجی
[ahmad, mehdi, mohammad, negin, zahra]
نکته: این متد برای مرتب سازی لیستها با مقدارهای تکی یا داده های اولیه است و نمیتواند برای لیست هایی از نوع classModel مرتب سازی را انجام دهد. برای اینکه با متد sort بتوان لیست هایی از نوع classModel را مرتب کرد باید اینترفیس Comparable را درون کلاس Override کرد.
متد ListIterator
این متد لیست را به ListIterator تبدیل میکند.
List<String> list1=new ArrayList<>();
list1.add("mehdi");
list1.add("ahmad");
list1.add("mohammad");
list1.add("negin");
list1.add("zahra");
ListIterator<String> iterator= list1.listIterator();
System.out.println(iterator.next());
خروجی
mehdi
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.