تمثل List
واحدة من هياكل البيانات في Java، وهي نوع مجموعة مفيد جدًا ويستخدم بشكل متكرر. بينما تلعب دورًا مشابهًا للمصفوفات (Array)، فإنها تقدم العديد من المزايا من حيث تغيير الحجم والتلاعب بالبيانات. في هذه المقالة، سنشرح المفاهيم الأساسية لاستخدام List
، والفصول الرئيسية الخاصة بالتطبيق، وسنوضح ذلك بشكل مفصل حتى يتمكن المبتدئون من فهمه.
Apidog هو أداة تتيح لك أتمتة اختبار واجهات برمجة التطبيقات بسهولة، مما يسهل إدارة عمليات القائمة ومعالجة البيانات بكفاءة. خاصةً عند دمج واجهة برمجة التطبيقات للتطبيقات المطورة بـ Java، يصبح تبادل البيانات دقيقًا ولاختبارات سلسة. بفضل الاختبارات المؤتمتة، يمكن للمطورين توفير الوقت والتركيز على تحسين جودة المنتج.
قم بتنزيل Apidog الآن، واجعل تطوير واجهات برمجة التطبيقات أكثر كفاءة، وقدم خدمات عالية الجودة بسرعة!
مفهوم القائمة
List
هي مجموعة مرتبة، ويمكنها تخزين نفس العنصر عدة مرات. كما يتم منح كل عنصر في List
فهرس (مؤشر)، مما يسمح بالوصول إليه مع الحفاظ على الترتيب. عمومًا، تعتبر List
أكثر مرونة من المصفوفات (Array) لأنها تتغير ديناميكيًا في الحجم.
تحدد المصفوفات الحجم عند الإعلان ولا يمكن تغيير هذا الحجم لاحقًا، بينما يمكن إجراء إضافات أو حذف عناصر في List
عند الحاجة. هذه الميزة تجعل استخدام List
نقطة قوة كبيرة.
فصول تطبيق القائمة
List
هو واجهة، ويوجد العديد من فصول التطبيق المحددة. في مكتبة Java القياسية، هناك فصول ممثلة مثل ArrayList
وLinkedList
. هذه الفصول تطبق واجهة List
، بينما تكون لها بنى بيانات داخلية مختلفة.
ArrayList
ArrayList
يستخدم مصفوفة ديناميكية داخلية، مما يجعل إضافة العناصر والوصول إليها عبر الفهارس سريعًا جدًا. ومع ذلك، فإن حذف أو إدراج العناصر قد يتطلب بعض الوقت. خصوصًا عند إدراج عنصر في منتصف القائمة، يجب تحريك العناصر الموجودة، مما يقلل من الأداء.
مثال على الاستخدام:
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
System.out.println(list.get(0)); // Apple
LinkedList
LinkedList
يستخدم قائمة مرتبطة (حيث يحتفظ كل عنصر بإشارة إلى العناصر السابقة والتالية). لذلك، يكون حذف أو إدراج العناصر فعالًا، إلا أن الوصول عبر الفهارس يكون أبطأ. خصوصًا، تكون العمليات على بداية أو نهاية القائمة سريعة.
مثال على الاستخدام:
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Dog");
linkedList.add("Cat");
linkedList.add("Rabbit");
System.out.println(linkedList.get(1)); // Cat
الطرق الأساسية لاستخدام القائمة
عند استخدام List
، من المفيد تذكر بعض العمليات الأساسية. هنا، سنعرض كيفية تهيئة List
، وإضافة العناصر، واستردادها، وحذفها، وغيرها من العمليات الأساسية.
تهيئة
List بسيطة، وتكتب على النحو التالي:
مثال على الاستخدام:
List<String> list = new ArrayList<>();
يمكنك أيضًا إضافة بعض العناصر أثناء التهيئة.
مثال على الاستخدام:
List<String> list = Arrays.asList("One", "Two", "Three");
إضافة عنصر
يمكنك إضافة عنصر باستخدام طريقة add()
.
مثال على الاستخدام:
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
استبدال عنصر
يمكنك استخدام طريقة set()
لاستبدال العنصر في الفهرس المحدد.
مثال على الاستخدام:
list.set(1, "C++");
استرداد عنصر
يمكنك استخدام طريقة get()
لاسترداد عنصر باستخدام الفهرس.
مثال على الاستخدام:
String language = list.get(0); // "Java"
حذف عنصر
يمكنك استخدام طريقة remove()
لحذف العنصر المحدد.
مثال على الاستخدام:
list.remove(0); // حذف "Java"
الطرق التي يمكن استخدامها مع القائمة
تحتوي List
على العديد من الطرق المفيدة بخلاف الإضافة، والحذف، والاسترداد. إليك بعض الطرق المستخدمة بشكل متكرر.
ترتيب العناصر
يمكنك استخدام طريقة Collections.sort()
لفرز عناصر القائمة.
مثال على الاستخدام:
Collections.sort(list);
معالجة كل عنصر في القائمة
يمكنك استخدام طريقة forEach()
لأداء معالجة على كل عنصر في القائمة.
مثال على الاستخدام:
list.forEach(element -> System.out.println(element));
العمليات التطبيقية على القائمة
List
لا يحتفظ فقط بالعناصر، بل يمكنه أيضًا إجراء مجموعة متنوعة من العمليات. على سبيل المثال، يمكن إجراء دمج وتفتيش القائمة، وإنشاء قائمة عكسية وغيرها من التطبيقات.
ترتيب العناصر
عند فرز العناصر في القائمة، يمكنك بسهولة ترتيبها باستخدام Collections.sort()
.
مثال على الاستخدام:
List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6);
Collections.sort(numbers);
System.out.println(numbers); // [1, 1, 2, 3, 4, 5, 6, 9]
دمج القوائم
يمكنك استخدام طريقة addAll()
لدمج قائمتين.
مثال على الاستخدام:
List<String> list1 = new ArrayList<>(Arrays.asList("Apple", "Banana"));
List<String> list2 = new ArrayList<>(Arrays.asList("Cherry", "Date"));
list1.addAll(list2);
System.out.println(list1); // [Apple, Banana, Cherry, Date]
عكس ترتيب القائمة
يمكنك استخدام Collections.reverse()
لعكس ترتيب القائمة.
مثال على الاستخدام:
List<String> list = new ArrayList<>(Arrays.asList("One", "Two", "Three"));
Collections.reverse(list);
System.out.println(list); // [Three, Two, One]
الفرق بين القائمة والمصفوفة
يتم استخدام List
والمصفوفات (Array) لتخزين بيانات متعددة، لكن هناك بعض الاختلافات المهمة.
- تغيير الحجم: المصفوفات ثابتة الحجم ولا يمكن تغييرها. بينما يمكن تغيير حجم
List
بشكل ديناميكي. - نوع العناصر: المصفوفات يمكنها تخزين بيانات من نفس النوع فقط، بينما يمكن استخدام
List
للتعامل مع عناصر من أنماط مختلفة باستخدام الجينيريكس. - الطرق: لا تحتوي المصفوفات على طرق، بينما تحتوي
List
على العديد من الطرق المفيدة مثل إضافة أو حذف أو استرداد أو تفتيش العناصر.
الأسئلة الشائعة (FAQ)
1: ما الفرق بين قائمة Java والمصفوفة؟
الإجابة:
الفرق الرئيسي بين القائمة والمصفوفة هو في مرونة تغيير الحجم. المصفوفة لها حجم ثابت، بينما يمكن أن تتغير القائمة بشكل ديناميكي. وهذا يجعل من السهل إضافة العناصر أو حذفها.
مثال على الكود:
// مثال المصفوفة
int[] arr = new int[5]; // حجم المصفوفة ثابت
arr[0] = 10;
arr[1] = 20;
// مثال القائمة
List<Integer> list = new ArrayList<>();
list.add(10); // يمكن تغيير الحجم
list.add(20);
التفسير:
في الكود أعلاه، تم الإعلان عن المصفوفة arr
بحجم 5 في البداية، ولا يمكن تغيير حجمها بعد ذلك. في المقابل، القائمة list
تستخدم ArrayList
، مما يعني أن حجمها يتغير ديناميكيًا مع كل إضافة عنصر.
2: ما الفرق بين ArrayList وLinkedList؟
الإجابة:ArrayList
سريع في الوصول عبر الفهارس، ولكن يمكن أن يستغرق وقتًا لفعل الإضافات أو الحذفات. من جهة أخرى، LinkedList
يحسن من الأداء عند الإضافات أو الحذفات ولكنه يكون أبطأ عند الوصول عبر الفهارس.
مثال على الكود:
// ArrayList
List<Integer> arrayList = new ArrayList<>();
arrayList.add(10);
arrayList.add(20);
System.out.println("العنصر الأول في ArrayList: " + arrayList.get(0));
// LinkedList
List<Integer> linkedList = new LinkedList<>();
linkedList.add(10);
linkedList.add(20);
System.out.println("العنصر الأول في LinkedList: " + linkedList.get(0));
التفسير:ArrayList
وLinkedList
كلاهما يطبق واجهة List
، لكنهم يختلفون في التركيبة الداخلية. ArrayList
يعتمد على المصفوفات، مما يجعل الوصول عبر الفهارس سريعًا. بينما LinkedList
يعتمد على قوائم ثنائية الاتجاه، مما يجعل إضافات أو حذفات العناصر فعالة، لكن الوصول عبر الفهارس يكون أبطأ.
3: كيف يمكن فرز عناصر القائمة؟
الإجابة:
يمكنك استخدام طريقة Collections.sort()
لفرز عناصر List
. بشكل افتراضي، يتم فرز العناصر في القائمة حسب ترتيبها الطبيعي.
مثال على الكود:
import java.util.*;
public class ListSortExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(30);
list.add(10);
list.add(20);
// فرز القائمة
Collections.sort(list);
// عرض القائمة بعد الفرز
System.out.println("القائمة بعد الفرز: " + list);
}
}
التفسير:
تقوم Collections.sort()
بفرز العناصر في القائمة بترتيب تصاعدي. في المثال أعلاه، تمت إضافة الأعداد 30
و10
و20
إلى ArrayList
، ثم تم الفرز باستخدام Collections.sort()
، والنتيجة ستكون [10, 20, 30]
.
خاتمة
تعتبر List
في Java فصل تجميع مرن وسهل الاستخدام، وتقدم العديد من المزايا مقارنة بالمصفوفات. من خلال الاستخدام الجيد لفصول التطبيق مثل ArrayList
وLinkedList
، يمكنك تنفيذ عمليات بيانات متنوعة وفقًا للسياقات المختلفة. إذا فهمت الاستخدامات الأساسية، سيتمكن المبتدئون من التعامل مع البيانات بشكل أكثر كفاءة.