Java الكلاس ArrayList في جافا

مقدمة

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

أهم ميزة في المصفوفات التي نوعها ArrayList هي أن عدد العناصر فيها غير ثابت, حيث أنه يزيد عند إضافة عنصر جديد فيها و ينقص عند حذف عنصر منها بشكل تلقائي، و هذه الميزة غير موجودة في المصفوفات العادية.

كما أنك تستطيع الوصول للعناصر الموجودة فيها عن طريق أرقام الـ Index التي تعطى بالترتيب لكل عنصر يضاف فيها.


بناؤه

public class ArrayList<E>
extends AbstractList<E>
implements<E>, RandomAccess, Cloneable, Serializable 
	

إذاً الكلاس ArrayList يرث من الكلاس AbstractList و يطبق الإنترفيسات List - Serializable - Cloneable - RandomAccess.

كونستركتورات الكلاس ArrayList

الجدول التالي يحتوي على جميع الكونستركتورات الموجودين في الكلاس ArrayList.

الكونستركتور مع تعريفه
public ArrayList() هذا الكونستركتور الإفتراضي في الكلاس ArrayList, يستخدم لإنشاء كائن نوعه ArrayList فارغ.
public ArrayList(int initialCapacity) يستخدم هذا الكونستركتور لتحديد حجم كائن الـ ArrayList الأولي.
الرقم الذي نضعه كـ Argument في هذا الكونستركتور يحدد عدد عناصر كائن الـ ArrayList الذي يمكنه احتوائهم على الأقل.
public ArrayList(Collection c) يستخدم هذا الكونستركتور لإنشاء كائن نوعه ArrayList يحتوي على عناصر كائن الـ Collection الذي نمرره له كـ Argument.

دوال الكلاس ArrayList

الجدول التالي يحتوي على جميع دوال الكلاس ArrayList.

الدالة مع تعريفها
public void add(int index, Object obj) تضيف عنصر جديد في مكان محدد في كائن الـ ArrayList.
  • obj هو الكائن الذي سيضاف.
  • index هو رقم الـ index الذي سيضاف فيه الكائن obj.
ترمي الإستثناء IndexOutOfBoundsException في حال كان الـ index المحدد فيها أصغر من 0 أو أكبر من عدد العناصر الموجودة.
public boolean add(Object o) تضيف عنصر جديد في آخر كائن الـ ArrayList.
ترجع true إذا تمت الإضافة بنجاح.
public boolean addAll(Collection c) تضيف جميع عناصر الكائن c في آخر كائن الـ ArrayList.
ترجع true إذا تمت الإضافة بنجاح.
ترمي الإستثناء NullPointerException في حال كان الكائن c فارغاً.
public boolean addAll(int index, Collection c) تضيف جميع عناصر الكائن c في مكان محدد في كائن الـ ArrayList.
ترجع true إذا تمت الإضافة بنجاح.
  • c هو مجموعة الكائنات التي ستضاف.
  • index هو رقم الـ index الذي سيضاف فيه الكائن c.
ترمي الإستثناء NullPointerException في حال كان الكائن c فارغاً.
public void clear() تمسح جميع العناصر الموجودة في كائن الـ ArrayList.
public Object clone() ترجع نسخة من كائن الـ ArrayList.
public boolean contains(Object o) ترجع true في حال كان كائن الـ ArrayList يملك الكائن الذي نضعه لها كـ Argument.
public void ensureCapacity(int minCapacity) تحدد عدد العناصر الأقل الذي يجب أن يحجز لكائن الـ ArrayList في الذاكرة.
إذا كان العدد الموضوع فيها أكبر من عدد العناصر المحجوز لكائن الـ ArrayList, عندها يتم تكبير حجمه.
إذا كان العدد الموضوع فيها أصغر من عدد العناصر الموجودة في كائن الـ ArrayList, لن تفعل أي شيء.
public Object get(int index) ترجع العنصر الموجود على الـ index الذي نمرره لها كـ Argument.
ترمي الإستثناء IndexOutOfBoundsException في حال كان الـ index المحدد فيها أصغر من 0 أو أكبر من عدد العناصر الموجودة.
public int indexOf(Object o) تبحث في كائن الـ ArrayList عن أي قيمة نمررها لها كـ Argument.
ترجع رقم أول Index يحتوي على القيمة المطلوبة في حال وجود نفس القيمة في أكثر من عنصر.
ترجع 1- في حال عدم إيجاد القيمة المطلوبة.
public int lastIndexOf(Object o) تبحث في كائن الـ ArrayList عن أي قيمة نمررها لها كـ Argument.
ترجع رقم آخر Index يحتوي على القيمة المطلوبة في حال وجود نفس القيمة في أكثر من عنصر.
ترجع 1- في حال عدم إيجاد القيمة المطلوبة.
public Object remove(int index) تحذف عنصر محدد من كائن الـ ArrayList.
ترمي الإستثناء IndexOutOfBoundsException في حال كان الـ index المحدد فيها أصغر من 0 أو أكبر من عدد العناصر الموجودة.
protected void removeRange(int fromIndex, int toIndex) تحذف جميع عناصر كائن الـ ArrayList الموجودة من fromIndex إلى toIndex.
public Object set(int index, Object element) تبدل عنصر محدد في كائن الـ ArrayList بعنصر جديد, و ترجعه أيضاً.
ترمي الإستثناء IndexOutOfBoundsException في حال كان الـ index المحدد فيها أصغر من 0 أو أكبر من عدد العناصر الموجودة.
public int size() ترجع عدد العناصر الموجودة في كائن الـ ArrayList.
public Object[] toArray() ترجع مصفوفة نوعها Object تحتوي على جميع العناصر الموجودة في كائن الـ ArrayList.
public void trimToSize() تصغر حجم كائن الـ ArrayList في الذاكرة, حيث أنها تحذف جميع الأماكن المحجوزة له في الذاكرة و التي لم يضطر إلى استخدامها.

أمثلة شاملة

في كل مثال موضوع استخدامنا كونستركتور مختلف و دوال جديدة.



المثال الأول

في المثال التالي قمنا بتعريف كائن نوعه ArrayList أدخلنا فيه 5 عناصر ثم حذفنا منه عنصرين.

استخدامنا الدوال التالية: add() - remove() - size().

Main.java
import java.util.ArrayList;   // ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // al إسمه ArrayList هنا قمنا بإنشاء كائن من الكلاس
        ArrayList al = new ArrayList();
 
        // و عرض عددهم al هنا قمنا بعرض عناصر الكائن
        System.out.println("All elements: " + al);
        System.out.println("Number of elements: " + al.size() + "\n");
 
        // al هنا قمنا بإضافة 5 عناصر في الكائن
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("D");
        al.add("E");
 
        // و عرض عددهم al هنا قمنا بعرض عناصر الكائن
        System.out.println("All elements: " + al);
        System.out.println("Number of elements: " + al.size() + "\n");
 
        // رقم 1 index و العنصر الموجود على الـ 'B' هنا قمنا بحذف العنصر الذي يملك القيمة
        al.remove("B");
        al.remove(1);
 
        // و عرض عددهم al هنا قمنا بعرض عناصر الكائن
        System.out.println("All elements: " + al);
        System.out.println("Number of elements: " + al.size() + "\n");
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

All elements: []
Number of elements: 0

All elements: [A, B, C, D, E]
Number of elements: 5

All elements: [A, D, E]
Number of elements: 3 
		


المثال الثاني

في المثال التالي قمنا بإضافة كائن نوعه ArrayList في كائن آخر نوعه ArrayList.
لاحظ هنا أنه عند إضافة كائن بواسطة الدالة add(Collection c) فإن جميع عناصره توضع في عنصر واحد.

Main.java
import java.util.ArrayList;   // ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // arr1 إسمه Arrayهنا قمنا بإنشاء كائن من الكلاس
        ArrayList arr1 = new ArrayList();
 
        // arr1 هنا قمنا بإضافة 5 عناصر في الكائن
        arr1.add("A");
        arr1.add("B");
        arr1.add("C");
        arr1.add("D");
        arr1.add("E");
 
        // arr2 إسمه ArrayList هنا قمنا بإنشاء كائن آخر من الكلاس
        ArrayList arr2 = new ArrayList();
 
        // arr2 في أول عنصر في الكائن arr1 هنا قمنا بإضافة جميع عناصر الكائن
        arr2.add(arr1);
 
        // arr1 و الذي يمثل مصفوفة تحتوي على جميع عناصر الكائن arr2 هنا قمنا بطباعة العنصر الأول الموجود في الكائن
        System.out.println("arr2 elements: " + arr2.get(0) + "\n");
 
        // arr2 هنا قمنا بعرض عدد عناصر الكائن
        System.out.println("Number of elements in arr2: " + arr2.size());
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

arr2 elements: [A, B, C, D, E]

Number of elements in arr2: 1 
		


المثال الثالث

في المثال التالي قمنا بتمرير كائن نوعه ArrayList في كونستركتور كائن آخر نوعه ArrayList.
لاحظ هنا أن جميع عناصر الكائن الأول ستوضع بنفس الترتيب في الكائن الثاني, و سيوضع كل كائن في عنصر أيضاً.

Main.java
import java.util.ArrayList;		// ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // arr1 إسمه ArrayList هنا قمنا بإنشاء كائن من الكلاس
        ArrayList arr1 = new ArrayList();
 
        // arr1 هنا قمنا بإضافة 5 عناصر في الكائن
        arr1.add("A");
        arr1.add("B");
        arr1.add("C");
        arr1.add("D");
        arr1.add("E");
 
        // arr1 يحتوي على جميع عناصر الكائن arr2 إسمه ArrayList هنا قمنا بإنشاء كائن آخر من الكلاس
        ArrayList arr2 = new ArrayList(arr1);
 
        // arr2 هنا قمنا بإضافة عنصر جديد في الكائن
        arr2.add("F");
 
        // arr2 و arr1 هنا عرضنا جميع العناصر الموجودة في الكائنين
        System.out.println("arr1 elements: " + arr1);
        System.out.println("arr2 elements: " + arr2);
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

arr1 elements: [A, B, C, D, E]
arr2 elements: [A, B, C, D, E, F]
		


المثال الرابع

في المثال التالي قمنا باستخدام الدوال التي تستخدم في البحث و التشييك.

استخدامنا الدوال التالية: add() - get() - size() - indexOf() - lastIndexOf() - contains().

Main.java
import java.util.ArrayList;		// ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // al إسمه ArrayList هنا قمنا بإنشاء كائن من الكلاس
        ArrayList al = new ArrayList();
 
        // al هنا قمنا بإضافة 9 عناصر في الكائن
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("D");
        al.add("E");
        al.add("A");
        al.add("B");
        al.add("C");
        al.add("Z");
 
        // al هنا عرضنا العنصر الأول في الكائن
        System.out.println("First element: " + al.get(0));
 
        // al هنا عرضنا العنصر الأخير في الكائن
        System.out.println("Last element:  " + al.get(al.size()-1) + "\n");
 
        // al هنا عرضنا خامس عنصر موجود في الكائن
        System.out.println("Element at al[4]: " + al.get(4) + "\n");
 
        // al موجودين في الكائن 'C' أول و آخر كائن index هنا عرضنا
        System.out.println("First index of the object 'C': " + al.indexOf("C"));
        System.out.println("Last index of the object 'C': " + al.lastIndexOf("C") + "\n");
 
        // F و D عن الكائنين al هنا بحثنا في عناصر الكائن
        System.out.println("Does it contain a 'D' object? " + al.contains("D"));
        System.out.println("Does it contain a 'F' object? " + al.contains("F"));
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

First element: A
Last element: Z

Element at al[4]: E

First index of the object 'C': 2
Last index of the object 'C': 7

Does it contain a 'D' object? true
Does it contain a 'F' object? false
		


المثال الخامس

في المثال التالي قمنا بنسخ عناصر كائن الـ ArrayList بداخل مصفوفة جديدة نوعها Object بواسطة الدالة toArray().

Main.java
import java.util.ArrayList;		// ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // al إسمه ArrayList هنا قمنا بإنشاء كائن من الكلاس
        Arrayal = new ArrayList();
 
        // al هنا قمنا بإضافة 3 عناصر في الكائن
        al.add("A");
        al.add("B");
        al.add("C");
 
        // al عدد عناصرها يساوي عدد عناصر الكائن ,Object هنا قمنا بإنشاء مصفوفة نوعها
        Object[] arr = new Object[al.size()];
 
        // arr بنفس الترتيب في المصفوفة al هنا قمنا بنسخ عناصر الكائن
        al.toArray(arr);
 
        // arr هنا أنشأنا حلقة تعرض جميع العناصر الموجودة في الحلقة
        for(int i=0; i<arr.length; i++) {
            System.out.println("arr[" +i+ "] = " +arr[i]);
        }
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

arr[0] = A
arr[1] = B
arr[2] = C
		


المثال السادس

في المثال التالي قمنا بإنشاء نسخة ثانية من كائن الـ ArrayList في كائن جديد نوعه Object بواسطة الدالة clone(), بعدها قمنا بمسح كائن الـ ArrayList الأصلي.

إنتبه: النسخة التي أنشأناها هنا تعتبر مجرد صورة للأشياء الموجودة في كائن الـ ArrayList.

Main.java
import java.util.ArrayList;		// ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // al إسمه Arrayهنا قمنا بإنشاء كائن من الكلاس
        ArrayList al = new ArrayList();
 
        // al هنا قمنا بإضافة 3 عناصر في الكائن
        al.add("A");
        al.add("B");
        al.add("C");
 
        // o في الكائن al هنا قمنا بنسخ عناصر الكائن
        Object o = al.clone();
 
        // al هنا قمنا بمسح جميع عناصر الكائن
        al.clear();
 
        // o و al هنا قمنا بعرض عناصر كل من الكائنات
        System.out.println("al = " +al);
        System.out.println("o  = " +o);
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

al = []
o  = [A, B, C]
		


المثال السابع

في المثال التالي قمنا بتحديد نوع الكائنات التي يمكن إدخالها في كائنات الـ ArrayList من خلال تطبيق مبدأ الـ Generics.

ملاحظة: سنشرح الـ Generics في درس خاص و هذا مجرد مثال بسيط.

Main.java
import java.util.ArrayList;		// ArrayList هنا قمنا باستدعاء الكلاس
 
public class Main {
 
    public static void main(String[] args) {
 
        // يمكنه تخزين كائنات من أي نوع كان arr1 إسمه Arrayهنا قمنا بإنشاء كائن من الكلاس
        ArrayList arr1 = new ArrayList();
 
        // فقط String يمكنه تخزين كائنات من النوع arr2 إسمه Arrayهنا قمنا بإنشاء كائن من الكلاس
        ArrayList<String> arr2 = new ArrayList<>();
 
        // فقط Integer يمكنه تخزين كائنات من النوع arr3 إسمه Arrayهنا قمنا بإنشاء كائن من الكلاس
        ArrayList<Integer> arr3 = new ArrayList<>();
 
 
        // arr1 هنا قمنا بإضافة 5 عناصر لها أنواع مختلفة في الكائن
        arr1.add(null);
        arr1.add(true);
        arr1.add(1234);
        arr1.add("java");
        arr1.add('A');
 
        // arr2 في الكائن String هنا قمنا بإضافة 3 عناصر نوعها
        arr2.add("A");
        arr2.add("B");
        arr2.add("C");
 
        // arr3 في الكائن int هنا قمنا بإضافة 3 عناصر نوعها
        arr3.add(1);
        arr3.add(2);
        arr3.add(3);
 
 
        // arr1 هنا قمنا بعرض عناصر الكائن
        System.out.println("arr1: " +arr1);
 
        // arr2 هنا قمنا بعرض عناصر الكائن
        System.out.println("arr2: " +arr2);
 
        // arr3 هنا قمنا بعرض عناصر الكائن
        System.out.println("arr3: " +arr3);
 
    }
 
}
		

سنحصل على النتيجة التالية عند التشغيل.

arr1: [null, true, 1234, java, A]
arr2: [A, B, C]
arr3: [1, 2, 3]
		

الدورات

أدوات مساعدة

أقسام الموقع

دورات
مقالات كتب مشاريع أسئلة