لينكدليست في جافا هو تنفيذ للواجهات ليست وديك. إنه أحد فئات التنفيذ الشائعة للقائمة. يوسع الفئة الثابتة المتسلسلة المجردة وينفذ واجهات القائمة وديك. إنه مجموعة مرتبة ويدعم عناصر مكررة. يخزن العناصر في ترتيب الإدراج. يدعم إضافة العناصر الفارغة. يدعم العمليات المستندة إلى الفهرس. إذا كنت ترغب في معرفة المزيد حول أساسيات القائمة، يرجى مراجعة هذا المنشور: قائمة جافا.
محتوى موجز للمنشور
في هذا المنشور سنناقش المفاهيم التالية.
- لينكدليست جافا
- رسم بياني لفئة لينكدليست جافا
- طرق القائمة لينكدليست جافا
- طرق ديك لينكدليست جافا
- مثال أساسي لينكدليست جافا
- التعميمات لينكدليست جافا
- مصفوفة جافا إلى لينكدليست
- لينكدليست جافا إلى مصفوفة
- حالات استخدام لينكدليست جافا في الوقت الحقيقي
- التمثيل الداخلي للينكدليست جافا
- كيفية عمل الإدراج في لينكدليست جافا؟
- كيفية عمل الحذف في لينكدليست جافا؟
- عمليات ديك لينكدليست جافا
- جافا SE 8: من لينكدليست جافا إلى ستريم
- لينكدليست جافا SE 9
قائمة الارتباط في جافا
في هذا القسم، سنناقش بعض النقاط الهامة حول قائمة الارتباط في جافا:
- فئة LinkedList في جافا هي عضو في إطار جمعيات جافا.
- إنها تمثل تنفيذًا لواجهات List وDeque.
- داخليًا، يتم تنفيذها باستخدام هيكل بيانات قائمة مزدوجة الروابط.
- تدعم العناصر المكررة.
- تخزن عناصرها في ترتيب الإدراج.
- يمكننا إضافة أي عدد من العناصر الفارغة.
- غير متزامنة، مما يعني أنها غير آمنة في السياق التناوبي.
- يمكننا إنشاء LinkedList متزامنة باستخدام طريقة Collections.synchronizedList().
- في تطبيقات جافا، يمكننا استخدامها كقائمة، أو كمكدس أو كصف.
- لا تقوم بتنفيذ واجهة RandomAccess. لذا يمكننا الوصول إلى العناصر بترتيب تسلسلي فقط، ولا تدعم الوصول العشوائي إلى العناصر.
- عند محاولة الوصول إلى عنصر من LinkedList، يبدأ البحث عن ذلك العنصر من بداية أو نهاية LinkedList استنادًا إلى مكان توفر العناصر.
- يمكننا استخدام ListIterator لتكرار عناصر LinkedList.
- ابتداءً من جافا SE 8، يمكننا تحويل LinkedList إلى Stream والعكس.
- سيقوم جافا SE 9 بإضافة بضع طرق مصنعية لإنشاء LinkedList لا تتغير.
رسم تخطيطي لفئة LinkedList في جافا
كما نعلم، LinkedList في جافا هي واحدة من فئات تنفيذ القائمة. كما تنفذ Deque. كما هو موضح في التخطيط الفئوي أدناه، فإنها لا تمتد مباشرة من فئة AbstractList. بل تمتد من فئة AbstractSequentialList.
أساليب قائمة LinkedList في جافا
في هذا القسم سنناقش بعض الأساليب المفيدة والمستخدمة بشكل متكرر في LinkedList في جافا. الأساليب التالية موروثة من واجهة List أو Collection:
- int size(): للحصول على عدد العناصر في القائمة.
- boolean isEmpty(): للتحقق مما إذا كانت القائمة فارغة أم لا.
- boolean contains(Object o): يعيد true إذا كانت هذه القائمة تحتوي على العنصر المحدد.
- Iterator iterator(): يعيد مُدرجًا على العناصر في هذه القائمة بترتيب مناسب.
- Object[] toArray(): يعيد مصفوفة تحتوي على جميع العناصر في هذه القائمة بترتيب مناسب.
- boolean add(E e): يلصق العنصر المحدد في نهاية هذه القائمة.
- boolean remove(Object o): يقوم بإزالة أول حدوث للعنصر المحدد من هذه القائمة.
- boolean retainAll(Collection c): يحتفظ فقط بالعناصر في هذه القائمة التي تمتلكها المجموعة المحددة.
- void clear(): يزيل جميع العناصر من القائمة.
- E get(int index): Returns the element at the specified position in the list.
- E set(int index, E element): Replaces the element at the specified position in the list with the specified element.
- ListIterator listIterator(): يعيد محدد قائمة على العناصر في القائمة.
- List subList(int fromIndex, int toIndex): يعيد عرضًا للجزء من هذه القائمة بين fromIndex المحدد، بما في ذلك، وtoIndex حصريًا. القائمة المعادة مدعومة بواسطة هذه القائمة، لذلك يتم عكس التغييرات غير الهيكلية في القائمة المعادة في هذه القائمة، والعكس صحيح.
طرق LinkedList Deque في جافا
الطرق التالية محددة لفئة LinkedList التي تمت إرثها من واجهة Deque:
- void addFirst(E e): يقوم بإدراج العنصر المحدد في بداية هذه القائمة.
- void addLast(E e): يقوم بإدراج العنصر المحدد في نهاية هذه القائمة.
- E getFirst(): Retrieves, but does not remove, the first element of this list. This method differs from peekFirst only in that it throws an exception if this list is empty.
- E getLast(): Retrieves, but does not remove, the last element of this list. This method differs from peekLast only in that it throws an exception if this list is empty.
- E remvoeFirst(): Removes and returns the first element from this list.
- E removeLast(): Removes and returns the last element from this list.
- boolean offerFirst(E e): يقوم بإدراج العنصر المحدد في الجزء الأمامي من هذه القائمة.
- boolean offerLast(E e): يقوم بإدراج العنصر المحدد في نهاية هذه القائمة.
- E pollFirst(): Retrieves and removes the first element of this list, or returns null if this list is empty.
- E pollLast(): Retrieves and removes the last element of this list, or returns null if this list is empty.
- E peekFirst(): Retrieves, but does not remove, the first element of this list, or returns null if this list is empty.
- E peekLast(): Retrieves, but does not remove, the last element of this list, or returns null if this list is empty.
مثال أساسي على LinkedList في جافا
في هذا القسم، سنناقش حول مثال أساسي لـ Java LinkedList. سنستكشف بعض العمليات المفيدة الأخرى في الأقسام القادمة. مثال:-
import java.util.LinkedList;
import java.util.List;
public class LinkedListDemo
{
public static void main(String[] args)
{
List names = new LinkedList();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
names.add(2011);
System.out.println("LinkedList content: " + names);
System.out.println("LinkedList size: " + names.size());
}
}
الناتج:-
LinkedList content: [Rams, Posa, Chinni, 2011]
LinkedList size: 4
هنا قمنا بإنشاء كائن LinkedList وأضفنا 4 عناصر. كما ناقشنا ، يستخدم الطريقة LinkedList.size() للحصول على عدد العناصر في القائمة. ملاحظة:- بدون استخدام Generics ، يدعم Java LinkedList عناصر مختلفة. ومع ذلك ، لا يُنصح باستخدام Collections بدون Generics. دعونا نستكشف مزايا Java Generics واستخدامه في القسم القادم مع مثال بسيط واحد.
Java LinkedList Generics
في هذا القسم، سنناقش كيفية استخدام Generics مع Java LinkedList. كما نعلم ، Java Generics مفيدة لكتابة برمجة آمنة من النوع وإجراء فحوصات نوعية أقوى في وقت التجميع. كما أنها مفيدة للقضاء على تكلفة الصب. مثال:-
import java.util.LinkedList;
import java.util.List;
public class LinkedListGenericsDemo
{
public static void main(String[] args)
{
List names = new LinkedList<>();
names.add("Rams");
names.add("Posa");
names.add("Chinni");
// لا يمكننا إضافة غير السلاسل
// names.add(2011);
System.out.println("LinkedList content: " + names);
System.out.println("LinkedList size: " + names.size());
}
}
الناتج:-
LinkedList content: [Rams, Posa, Chinni]
LinkedList size: 3
هنا قمنا بإنشاء كائن LinkedList مع Generics وأضفنا 3 عناصر. عندما نحاول إضافة رقم لـ LinkedList ، يُلقي خطأ في وقت التجميع.
Java Array to LinkedList
في هذا القسم، سنستكشف كيفية تحويل مصفوفة Java إلى كائن LinkedList. يمكننا القيام بذلك بعدة طرق، ومع ذلك، لقد قدمت هنا فقط نهجًا واحدًا. مثال:-
import java.util.LinkedList;
import java.util.List;
public class JavaArrayToLinkedListDemo
{
public static void main(String[] args)
{
Integer[] numbers = {1,2,3,4,5};
List<Integer> numbersList = new LinkedList<>();
for(Integer s : numbers){
numbersList.add(s);
}
System.out.println(numbersList);
}
}
الناتج:-
[1, 2, 3, 4, 5]
Java LinkedList إلى Array
في هذا القسم، سنستكشف كيفية تحويل LinkedList في Java إلى مصفوفة. يمكننا القيام بذلك بعدة طرق، ومع ذلك، لقد قدمت هنا فقط نهجًا واحدًا. مثال:-
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class LinkedListToJavaArrayDemo
{
public static void main(String[] args)
{
List<Integer> numbersList = new LinkedList<>();
numbersList.add(1);
numbersList.add(2);
numbersList.add(3);
numbersList.add(4);
numbersList.add(5);
Integer[] numbers = new Integer[numbersList.size()];
numbers = numbersList.toArray(numbers);
System.out.println(Arrays.toString(numbers));
}
}
الناتج:-
[1, 2, 3, 4, 5]
حالات استخدام LinkedList في الوقت الحقيقي في Java
في هذا القسم، سنناقش ما هي أفضل وأسوأ حالات السيناريو لاستخدام LinkedList في تطبيقات Java. أفضل حالة استخدام:-
- عندما تكون عملياتنا الشائعة هي إضافة أو إزالة العناصر في منتصف القائمة، فإن LinkedList هو أفضل فئة للاستخدام.
لماذا؟ لأنه لا نحتاج إلى إجراء مزيد من التحولات لإضافة أو إزالة العناصر في منتصف القائمة. يرجى الرجوع إلى قسم “كيفية عمل الإدراج في Java LinkedList؟” لفهم ذلك بالتفصيل. أسوأ حالة استخدام:-
- Translated text:
عندما يكون العمل الذي نقوم به بشكل متكرر هو استرجاع العناصر من القائمة، فإن LinkedList هو أسوأ اختيار.
لماذا؟ لأن LinkedList يدعم الوصول التسلسلي فقط ولا يدعم الوصول العشوائي. يرجى الرجوع إلى قسم “كيفية عمل الحذف في LinkedList في لغة البرمجة جافا؟” لفهم ذلك بشكل مفصل. ملاحظة:- تنفيذ LinkedList للواجهات List وDeque وCloneable وSerializable. ولكنه لا ينفذ واجهة RandomAccess.
التمثيل الداخلي لـ Java LinkedList
كما نعلم، يتم تنفيذ LinkedList في لغة البرمجة جافا داخليًا باستخدام قائمة مزدوجة الروابط. لذلك، تمثل LinkedList في لغة البرمجة جافا عناصرها على شكل عقد. يتم تقسيم كل عقد إلى 3 أجزاء كما هو موضح أدناه. حيث يتم استخدام كل عقد لغرض معين.
- يُستخدم الجزء الأيسر من العقد للإشارة إلى العقد (أو العنصر) السابق في LinkedList.
- يُستخدم الجزء الأيمن من العقد للإشارة إلى العقد (أو العنصر) التالي في LinkedList.
- يُستخدم الجزء المركزي من العقد لتخزين البيانات الفعلية.
ملاحظة:- في JVM، لا تقوم LinkedList بتخزين عناصرها بترتيب متتالي. إنها تقوم بتخزين عناصرها في أي مساحة متاحة وتربطها ببعضها البعض باستخدام أجزاء العقدة اليسرى واليمنى كما هو موضح في الرسم البياني أدناه.
كيفية عمل عملية الإدراج في LinkedList في جافا؟
لقد رأينا بالفعل كيف تخزن LinkedList عناصرها كعقدات في القسم السابق. في هذا القسم، سنناقش كيفية عملية إدراج Java LinkedList داخليًا.
- لنفترض أن LinkedList الأولي لدينا تحتوي على البيانات التالية.
3. قم بتنفيذ عملية الإدراج التالية في هذا LinkedList
linkedList.add(2,54);
هنا نحاول تنفيذ عملية الإدراج لإضافة عنصر جديد بقيمة “54” في المؤشر 2.5. يبدو LinkedList المحدث كما يلي.
كيفية عمل عملية الحذف في LinkedList في جافا؟
لقد شاهدنا بالفعل كيفية أداء عملية الإدراج في LinkedList داخليًا في القسم السابق. في هذا القسم ، سنناقش كيفية عمل عملية حذف LinkedList في جافا داخليًا.
- دعنا نفترض أن LinkedList الأولية لدينا تحتوي على البيانات التالية.
3. قم بتنفيذ عملية الإدراج التالية في هذا LinkedList
linkedList.remove(3);
هنا نحاول تنفيذ عملية الحذف لحذف عنصر متاح في المؤشر 3.5. يبدو LinkedList المحدث على النحو التالي.
عمليات جافا LinkedList Deque
هنا سنستكشف كيف يعمل كائن LinkedList كـ Deque. نستخدم هذه العمليات لتنفيذ الطوابير أو الكومة. سنناقش كيفية عمل الطوابير أو الكومة بشكل مفصل في مشاركاتي القادمة. مثال:-
import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Deque;
public class LinkedListDequeOperationsDemo
{
public static void main(String[] args)
{
Deque names = new LinkedList();
names.add(2);
names.addFirst(1);
names.addLast(3);
names.addFirst(0);
names.addLast(4);
System.out.println("LinkedList content: " + names);
System.out.println("LinkedList size: " + names.size());
names.removeFirst();
names.removeLast();
System.out.println("LinkedList content: " + names);
System.out.println("LinkedList size: " + names.size());
}
}
الناتج:-
LinkedList content: [0, 1, 2, 3, 4]
LinkedList size: 5
LinkedList content: [1, 2, 3]
LinkedList size: 3
Java SE 8: Java LinkedList إلى Stream
هنا سنستكشف كيفية تحويل كائن LinkedList إلى مفهوم Java SE 8 Stream. مثال:-
import java.util.LinkedList;
import java.util.List;
public class LinkedListToStreamDemo
{
public static void main(String[] args)
{
List numbersList = new LinkedList<>();
numbersList.add(1);
numbersList.add(2);
numbersList.add(3);
numbersList.add(4);
numbersList.add(5);
//تحويل List إلى Stream
numbersList.stream().forEach(System.out::println);
}
}
الإخراج:-
1
2
3
4
5
Java SE 9 LinkedList
في Java SE 9، ستقوم Oracle Corp بإضافة بعض الطرق الفعالة لإنشاء قائمة غير قابلة للتغيير. إذا كنت ترغب في تعلمها بشكل عميق مع بعض الأمثلة المفيدة، يرجى مراجعة مشاركتي في: Java SE 9: Factory Methods for Immutable List هذا كل شيء من ملخص سريع حول LinkedList في Java. آمل أن تساعدك أمثلة LinkedList في Java في البدء في برمجة LinkedList. شكراً لقراءة دروسي. يرجى ترك تعليق إذا كنت تحب دروسي أو لديك أي مشاكل أو اقتراحات أو أخطاء من أي نوع.
Source:
https://www.digitalocean.com/community/tutorials/java-linkedlist-linkedlist-java