Apidog

منصة تطوير API تعاونية متكاملة

تصميم API

توثيق API

تصحيح أخطاء API

محاكاة API

اختبار API الآلي

دليل للمبتدئين! أساسيات واستخدام قوائم ومصفوفات Java

Ahmed Waheed

Ahmed Waheed

Updated on ديسمبر 18, 2024

تمثل List واحدة من هياكل البيانات في Java، وهي نوع مجموعة مفيد جدًا ويستخدم بشكل متكرر. بينما تلعب دورًا مشابهًا للمصفوفات (Array)، فإنها تقدم العديد من المزايا من حيث تغيير الحجم والتلاعب بالبيانات. في هذه المقالة، سنشرح المفاهيم الأساسية لاستخدام List، والفصول الرئيسية الخاصة بالتطبيق، وسنوضح ذلك بشكل مفصل حتى يتمكن المبتدئون من فهمه.

💡
تعلم الأساسيات حول Java وعمليات القائمة هو الخطوة الأولى نحو تحسين مهارات البرمجة. ومع ذلك، فقد يكون اختبار واجهات برمجة التطبيقات وإدارتها أمرًا لا غنى عنه في التطوير الفعلي. هنا يأتي دور Apidog!
Apidog هو أداة تتيح لك أتمتة اختبار واجهات برمجة التطبيقات بسهولة، مما يسهل إدارة عمليات القائمة ومعالجة البيانات بكفاءة. خاصةً عند دمج واجهة برمجة التطبيقات للتطبيقات المطورة بـ Java، يصبح تبادل البيانات دقيقًا ولاختبارات سلسة. بفضل الاختبارات المؤتمتة، يمكن للمطورين توفير الوقت والتركيز على تحسين جودة المنتج.
قم بتنزيل Apidog الآن، واجعل تطوير واجهات برمجة التطبيقات أكثر كفاءة، وقدم خدمات عالية الجودة بسرعة!
زر

مفهوم القائمة

List هي مجموعة مرتبة، ويمكنها تخزين نفس العنصر عدة مرات. كما يتم منح كل عنصر في List فهرس (مؤشر)، مما يسمح بالوصول إليه مع الحفاظ على الترتيب. عمومًا، تعتبر List أكثر مرونة من المصفوفات (Array) لأنها تتغير ديناميكيًا في الحجم.

تحدد المصفوفات الحجم عند الإعلان ولا يمكن تغيير هذا الحجم لاحقًا، بينما يمكن إجراء إضافات أو حذف عناصر في List عند الحاجة. هذه الميزة تجعل استخدام List نقطة قوة كبيرة.

فصول تطبيق القائمة

List هو واجهة، ويوجد العديد من فصول التطبيق المحددة. في مكتبة Java القياسية، هناك فصول ممثلة مثل ArrayList وLinkedList. هذه الفصول تطبق واجهة List، بينما تكون لها بنى بيانات داخلية مختلفة.

java-list

ArrayList

ArrayList يستخدم مصفوفة ديناميكية داخلية، مما يجعل إضافة العناصر والوصول إليها عبر الفهارس سريعًا جدًا. ومع ذلك، فإن حذف أو إدراج العناصر قد يتطلب بعض الوقت. خصوصًا عند إدراج عنصر في منتصف القائمة، يجب تحريك العناصر الموجودة، مما يقلل من الأداء.

java-ArrayList

مثال على الاستخدام

ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");

System.out.println(list.get(0));  // Apple

LinkedList

LinkedList يستخدم قائمة مرتبطة (حيث يحتفظ كل عنصر بإشارة إلى العناصر السابقة والتالية). لذلك، يكون حذف أو إدراج العناصر فعالًا، إلا أن الوصول عبر الفهارس يكون أبطأ. خصوصًا، تكون العمليات على بداية أو نهاية القائمة سريعة.

java-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، يمكنك تنفيذ عمليات بيانات متنوعة وفقًا للسياقات المختلفة. إذا فهمت الاستخدامات الأساسية، سيتمكن المبتدئون من التعامل مع البيانات بشكل أكثر كفاءة.