تفاوت بین arraylist و linklist و مثالی از آن در جاوا

تفاوت بین arraylist و linklist و مثالی از آن در جاوا

لیست ها روش های ساده ای برای دستکاری ، ذخیره و بازیابی داده ها ارائه می دهند. لیست ها به طور گسترده در تمام زبان های برنامه نویسی مانند C ، C ++ ، Java ، Python و غیره مورد استفاده قرار می گیرند ... . لیست توسعه یافته مجموعه generic است.
در این مقاله با ArrayList و LinkedList آشنا می شویم ، و سپس مثال هایی در جاوا میزنیم و سپس در ادامه به مقایسه هر دو مورد می پردازیم تا بفهمیم چگونه از هریک از این موارد برای موقعیت های مختلف استفاده می شود.
ArrayList چیست؟
ArrayList ساده ترین لیستی است که می تواند انواع مختلفی از داده ها را ذخیره کند. برای درک ArrayList ، داده های زیر را که در یک آرایه ذخیره شده اند در نظر بگیرید :
String[] names = new String5]];
names[0] = "Mac";
names[1] = "Jony";
names[2] = "Mary";
names[3] = "Donald";
names[4] = "Phoebe";
 
 Student یک کلاس است که اطلاعات مربوط به دانشجویان یک کالج مانند نام ، سن ، موضوع ، نمرات متوسط ، شناسه ایمیل ، جنسیت و اینکه آیا آنها علائم متمایز دارند یا خیر را در اختیار دارد.
جزئیات هر دانش آموز در آرایه ای به نامnames  ذخیره می شود. اندازه آرایه به صورت 5 ثابت است. با این وجود ، اگر دانش آموزان بیش از 5 نفر بشوند چه اتفاقی می افتد؟
با ArrayList ، این مشکل رخ نخواهد داد. ArrayList یک آرایه پویا است که با افزایش تعداد عناصر در اندازه رشد می کند.
ArrayList<String> namesList = new ArrayList();
namesList.add("Mac");
namesList.add("Jony");
namesList.add("Mary");
namesList.add("Donald");
namesList.add("Phoebe"); 

همانطور که می بینیم ، اندازه اولیه ای به لیست داده نشده است. این فقط می تواند عناصر را با افزایش لیست اضافه کند. در حقیقت ، هر نوع دستکاری با ArrayList آسان است. اگر می خواهید به هر عنصر لیست دسترسی پیدا کنید ، می توانید به راحتی آن را با استفاده از index دریافت کنید. index اولیه همیشه صفر است. فرض کنید ، شما می خواهید نام " Mary" را " Maryln" جایگزین کنید ، می توانید کار های زیر را انجام دهید:
namesList.remove(namesList.get(2));
namesList.add(2, "Maryln"); 

نام قبلی را حذف کرده ایم و نام جدید را در همان مکان اضافه کرده ایم. همچنین می توانید عناصر را در هر مکان اضافه کنید. مثلا:
namesList.add(2, "Joseph"); 
Joseph جایگزین " Maryln" نمی شود بلکه آن را به index بعدی منتقل می کند. اگر لیستی را که می گیرید چاپ کنید :
[Mac, Jony, Joseph, Maryln, Donald, Phoebe]
  0 1 2 3 4 5

این به معنای اضافه شدن "یوسف" است ، همه عناصر یک واحد به راست منتقل شده اند. به همین ترتیب ، وقتی Mary را حذف کردیم ، همه عناصر دیگر باید به سمت چپ منتقل شوند.
مقادیر تکراری در ArrayList کاملاً قابل قبول است. اگر عنصر دیگری را با همین نام اضافه کنیم ، اندازه لیست رشد می کند و مقدار آن بدون هیچ مشکلی نمایش داده می شود.
همچنین مرتب سازی اشیاء به ترتیب صعودی یا نزولی با ArrayList با استفاده از نوع متد sort کلاس java.util.Collections آسان است.
ArrayList هماهنگ نیست ، به این معنی که اگر چندین thread همزمان یک لیست را تغییر دهند ، نتیجه می تواند غیرقابل پیش بینی باشد. ما همچنین می توانیم مقدار null را به ArrayList اضافه کنیم ، که در موقعیت آن به صورت "تهی" نمایش داده می شود.
LinkedList
LinkedList یک ساختار داده خطی است که در آن به هر عنصر لیست گره گفته می شود که حاوی مقدار عنصر و اشاره گر به گره قبلی و بعدی است. در جاوا ، LinkedList به عنوان یک لیست مضاعف بطور داخلی پیاده سازی می شود(اگرچه ، جاوا از لیست Singly Linked نیز پشتیبانی می کند). در یک لیست مضاعف ، هر گره به غیر از ارزش واقعی گره ، به گره های بعدی و قبلی خود اشاره دارد. 
اشاره گر قبلی سمت چپ هر آیتم را مشخص می کند و اشاره گر بعدی آیتم بعدی را نشان می دهد. اولین گره دارای نشانگر گره قبلی به عنوان تهی است ، در حالی که اشاره گر بعدی به گره دوم در لیست اشاره می کند. آیتم دوم دارای یک اشاره گر قبلی به آیتم اول و اشاره گر بعدی به مورد سوم است. از آنجا که مورد سوم عنصر آخر است ، نشانگر بعدی تهی است و نشانگر قبلی آیتم سوم همان نشانگر بعدی به آیتم دوم است این بدان معنی است که هر دو مقادیر یکسان هستند و توالی لیست را تعیین می کنند.
انواع دیگر LinkedList لیست پیوندی یک طرفه و لیست پیوندی دایره ای است.
LinkedList دارای ویژگی های مشابه ArrayList است. به عنوان مثال ، می توانید اشیاء را با استفاده از index با استفاده از متد get (<index>)  بدست آورید ، می توانید عناصر را اضافه کرده ، حذف کرده و به همان تعداد مورد نیاز ذخیره کنید. هنگام کدزنی ، تفاوت زیادی بین ArrayList و LinkedList مشاهده نخواهید کرد. نمونه اولیه ما ، هنگام استفاده از LinkedList به شرح زیر است :
;()<LinkedList<String> lnkdlst = new LinkedList<String
;("lnkdlst.add("Mac
;("lnkdlst.add("Jony
;("lnkdlst.add("Mary
;("lnkdlst.add("Donald
;("lnkdlst.add("Phoebe
;("lnkdlst.add("Mac
;((System.out.println("The first element is - " + lnkdlst.get(0
;((System.out.println("The last element is - " + lnkdlst.get(lnkdlst.size()-1
;(Collections.sort(lnkdlst
;(System.out.println("Sorted linked list - " + lnkdlst
;("lnkdlst.add(1, "Joana
;("lnkdlst.remove("Mac
;(System.out.println("After additions and deletions - " + lnkdlst 

همانطور که متوجه خواهید شد ، ما می توانیم نسخه های تکراری اضافه کنیم ، همچنین نام " Joana" در index "1" اضافه شده است. اگر هیچ شاخصی را مشخص نکنیم ، عناصر به انتهای لیست اضافه می شوند. درج ها را می توان در هر نقطه در LinkedList انجام داد بدون اینکه نیاز به تغییر هر شاخص به صورت جداگانه نمی باشد در نتیجه کار سریع تر می شود.
در صورت اجرای کد بالا ، خروجی نمونه در اینجا آمده است :
The first element is - Mac
The last element is - Mac
Sorted linked list - [Donald, Jony, Mac, Mac, Mary, Phoebe, Steve]
After additions and deletions - [Donald, Jony, Mac, Mary, Phoebe, Steve, Joana, null] 

درست مانند ArrayList ، LinkedList نیز sync نیست و می تواند مقادیر null را در خود نگه دارد.
در اینجا اولین آشکار می شود - در حالی که ArrayList فقط لیست را پیاده سازی می کند ، LinkedList لیست و صف را پیاده سازی می کند! بنابراین ، LinkedList پیاده سازی Deque و List است و از متدهای خاصی از Deque نیز ارث بری می کند. یک نمونه رایج از این متد ها ،() descendingIterator است که در ArrayList موجود نیست. این متد ترتیب لیست را معکوس می کند و تکرار کننده را برمی گرداند یعنی عناصر از ته به سر نشان داده می شوند :
;()Iterator itr = lnkdlst.descendingIterator
}(()while (itr.hasNext
             ;(()System.out.println("Value is : " + itr.next
      { 

با این حال ، این لیست پیوند اصلی را تغییر نمی دهد.
Deque چیست؟
Deque یک صف دو طرفه است. با پیاده سازی Deque می توان از LinkedList به عنوان یک پشته ، لیست یا صف استفاده کرد. 
مقایسه Arraylist و LinkedList:
حالا که ما از هر دو این موارد اطلاع داریم ، بیایید اختلافات آن ها را بررسی کنیم:
ArrayList
به عنوان یک آرایه پویا با استفاده از یک آرایه از اشیاء برای ذخیره عناصر پی در پی پیاده سازی می شود
رابط List را پیاده سازی می کند
ذخیره و دسترسی به داده ها با استفاده از index سریعتر است
حذف و اضافه کردن آیتم کند است زیرا همه موارد دیگر به ترتیب باید به چپ یا راست منتقل شوند.
حذف یک آیتم در حین تکرار از طریق لیست کندتر است زیرا برای پر کردن شکاف ایجاد شده در لیست ایجاد شده توسط عناصر حذف شده ، باید همه عناصر دیگر جابجا شوند.
می توانید اندازه سازنده اولیه ArrayList را با استفاده از سازنده (ArrayList(int capacityمشخص کنید. اندازه می تواند بعداً رشد کند ، با این وجود می توان مقدار اولیه ای را تعیین کرد. اگر از ظرفیت مشخص شده تجاوز نکند ، ArrayList حتی سریعتر عمل می کند.
هیچ پیش نیازی برای استفاده از متد های Queue یا Deque وجود ندارد.
ArrayList را نمی توان به عنوان Stack استفاده کرد.
LinkedList
به عنوان یک لیست پیوندی مضاعف (در جاوا) ، از اشاره گرها به گره های قبلی و بعدی تشکیل شده است.
List و Deque را پیاده سازی می کند که به آن قابلیت های بیشتری می دهد
بازیابی و ذخیره سازی کمی کند است زیرا لیست برای شناسایی صحیح ، باید از هر گره عبور کند.
سریعتر و کارآمدتر برای دستکاری داده ها مانند اضافه کردن و حذف عناصر از هر بخشی از لیست
از بین بردن یک عنصر در حین تکرار ساده است و فقط باید گره های بعدی و قبلی تنظیم شوند.
LinkedList فقط از سازنده بدون آرگومان پشتیبانی می کند - ()LinkedList
Deque ، که () descendingIterator را ارائه می دهد، پیاده سازی می کند.
متد های مشابه مانند() peek  ()، poll  و() offer  (و انواع آن) در دسترس است به طوری که لیست به عنوان یک صف عمل می کند.
از آنجا که Deque از متد های () push  ()، peek  و() pop  پشتیبانی می کند ، از LinkedList می توان به عنوان Stack استفاده کرد.
نتیجه
در حالی که هیچ پاسخ درست یا غلطی برای این سوال وجود ندارد که از کدام مورد باید استفاده کرد ، مطمئناً به نیاز شما بستگی دارد. اگر نمی خواهید پس از ایجاد لیست ، بیش از حد آن را تغییر دهید ، ArrayList انتخاب بهتری است. اگر دستکاری های زیادی انجام شود ، LinkedList سریعتر است. بسیاری از ویژگی های دیگر که LinkedList در اختیار دارد به دلیل اجرای یک رابط Deque است که می تواند یک مزیت اضافه باشد. هر دو ساختار داده در سایر زبانها مانند C یا++ C  از همین اصل پیروی می کنند. 

نظر شما