List و ArrayList

ArrayList هي أكثر Collections استخدامًا في Java. في هذا الدرس، سنتعلم كيفية استخدامها.

إنشاء ArrayList

JAVA
import java.util.ArrayList;
import java.util.List;

// قائمة فارغة
ArrayList<String> names = new ArrayList<>();

// قائمة بقيم أولية
List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3, 4, 5));

// بسعة محددة
ArrayList<String> list = new ArrayList<>(100);

العمليات الأساسية

إضافة عناصر

JAVA
ArrayList<String> names = new ArrayList<>();
names.add("أحمد");       // إضافة في النهاية
names.add(0, "محمد");    // إضافة في موقع محدد
names.addAll(List.of("علي", "حسن"));  // إضافة مجموعة

الوصول للعناصر

JAVA
ArrayList<String> names = new ArrayList<>(List.of("أحمد", "محمد", "علي"));

String first = names.get(0);        // أحمد
int size = names.size();             // 3
boolean has = names.contains("محمد"); // true
int index = names.indexOf("علي");    // 2

تعديل العناصر

JAVA
ArrayList<String> names = new ArrayList<>(List.of("أحمد", "محمد", "علي"));
names.set(1, "حسن");  // استبدال العنصر في الموقع 1

حذف العناصر

JAVA
ArrayList<String> names = new ArrayList<>(List.of("أحمد", "محمد", "علي"));
names.remove(0);           // حذف بالفهرس
names.remove("محمد");      // حذف بالقيمة
names.removeIf(n -> n.startsWith("أ"));  // حذف بشرط

تفريغ القائمة

JAVA
names.clear();  // حذف جميع العناصر
boolean empty = names.isEmpty();  // true

المرور على القائمة

باستخدام for

JAVA
for (int i = 0; i < names.size(); i++) {
    System.out.println(names.get(i));
}

باستخدام for-each

JAVA
for (String name : names) {
    System.out.println(name);
}

باستخدام forEach (Java 8+)

JAVA
names.forEach(name -> System.out.println(name));

باستخدام Iterator

JAVA
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

ترتيب القائمة

JAVA
import java.util.Collections;

ArrayList<Integer> numbers = new ArrayList<>(List.of(5, 2, 8, 1, 9));

Collections.sort(numbers);      // ترتيب تصاعدي
Collections.reverse(numbers);   // عكس الترتيب
Collections.shuffle(numbers);   // خلط عشوائي

ترتيب مخصص

JAVA
ArrayList<String> names = new ArrayList<>(List.of("محمد", "أحمد", "علي"));

// ترتيب أبجدي
Collections.sort(names);

// ترتيب حسب الطول
names.sort((a, b) -> a.length() - b.length());

تحويل المصفوفات

من Array إلى ArrayList

JAVA
String[] array = {"أحمد", "محمد", "علي"};
List<String> list = new ArrayList<>(Arrays.asList(array));
// أو
List<String> list2 = List.of(array);  // Java 9+

من ArrayList إلى Array

JAVA
List<String> list = new ArrayList<>(List.of("أحمد", "محمد", "علي"));
String[] array = list.toArray(new String[0]);

ArrayList مع الأنواع البدئية

JAVA
// ❌ خطأ: لا يمكن استخدام int
// ArrayList<int> list = new ArrayList<>();

// ✅ صحيح: استخدم Integer
ArrayList<Integer> list = new ArrayList<>();
list.add(10);  // Auto-boxing: int → Integer
int value = list.get(0);  // Auto-unboxing: Integer → int

مثال: قائمة مشتريات

JAVA
import java.util.ArrayList;

public class ShoppingList {
    private ArrayList<String> items = new ArrayList<>();
    
    public void addItem(String item) {
        items.add(item);
        System.out.println("تمت إضافة: " + item);
    }
    
    public void removeItem(String item) {
        if (items.remove(item)) {
            System.out.println("تم الحذف: " + item);
        } else {
            System.out.println("العنصر غير موجود");
        }
    }
    
    public void display() {
        System.out.println("\n--- قائمة المشتريات ---");
        for (int i = 0; i < items.size(); i++) {
            System.out.println((i + 1) + ". " + items.get(i));
        }
    }
    
    public static void main(String[] args) {
        ShoppingList list = new ShoppingList();
        list.addItem("خبز");
        list.addItem("حليب");
        list.addItem("بيض");
        list.display();
        list.removeItem("حليب");
        list.display();
    }
}

❓ أسئلة شائعة

س لماذا نستخدم List بدلاً من ArrayList في التعريف؟
ج List هي الواجهة، ArrayList هي التنفيذ. هذا يسمح بتغيير التنفيذ بسهولة.
س ما هو Auto-boxing؟
ج التحويل التلقائي بين الأنواع البدئية والفئات المغلفة (int → Integer).
س هل ArrayList آمنة للخيوط؟
ج لا، استخدم Vector أو Collections.synchronizedList() للخيوط المتعددة.

📖 ملخص

📝 تمارين

  1. قائمة أسماء: أنشئ قائمة أسماء وأضف احذف وابحث
  2. ترتيب: أنشئ قائمة أرقام ورتبها تصاعديًا وتنازليًا
  3. قائمة مهام: أنشئ قائمة مهام مع إضافة وحذف وعرض

الدرس التالي

في الدرس التالي، سنتعلم Set و HashSet — المجموعات الفريدة.

100%