كيفية تحويل مصفوفة إلى ArrayList في جافا: 4 طرق مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحويل المصفوفة إلى ArrayList: لماذا هو صداع أبدي لمطور جافا

\n\n

كل من كتب بلغة جافا ولو مرة واحدة، واجه هذا الموقف: لديك مصفوفة جاهزة String[] أو int[]، ولكن المهمة تتطلب ArrayList مرنًا بأساليبه add() و remove() وحجمه الديناميكي. تبدو مسألة بسيطة، لكن هذا السؤال تحديدًا على Stack Overflow حصد عشرات الآلاف من المشاهدات والكثير من الأصوات. لماذا؟ لأنه، كما يحدث غالبًا في جافا، هناك حل "واضح" يخفي مخاطر خفية.

\n\n

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

\n\n

هيا بنا! (أو كما يقول مطورو جافا — let's dive into the code)

\n\n

الطريقة 1: الكلاسيكية — Arrays.asList()

\n\n

الطريقة الأكثر شيوعًا وقصرًا. على الأرجح رأيتها:

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nList<String> fruitList = Arrays.asList(fruits);
\n\n

تبدو جميلة، أليس كذلك؟ لكن هناك فارق بسيط. الطريقة Arrays.asList() لا تُرجع java.util.ArrayList، بل تُرجع نسختها الداخلية الثابتة — java.util.Arrays.ArrayList. هذه قائمة ثابتة لا تدعم عمليات تغيير الحجم. إذا حاولت تنفيذ fruitList.add("date")، ستحصل على UnsupportedOperationException.

\n\n

الإيجابيات:

\n
    \n
  • كود قصير وقابل للقراءة إلى أقصى حد.
  • \n
  • يعمل كجسر بين المصفوفة وواجهة برمجة التطبيقات للمجموعات.
  • \n
  • التغييرات في القائمة تنعكس على المصفوفة الأصلية (والعكس صحيح).
  • \n
\n\n

السلبيات:

\n
    \n
  • حجم ثابت — لا يمكن إضافة أو إزالة العناصر.
  • \n
  • القائمة المُرجعة هي "غلاف" حول المصفوفة، وليست ArrayList كاملة.
  • \n
\n\n

متى تستخدم: عندما تحتاج إلى قائمة للقراءة فقط، أو عندما تعرف يقينًا أن الحجم لن يتغير. على سبيل المثال، لتمريرها إلى طريقة تستقبل List<?> ولا تقوم بتعديلها.

\n\n

كيف تحصل على ArrayList كامل من Arrays.asList()؟

\n\n

ببساطة، قم بتغليف النتيجة في المُنشئ:

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(Arrays.asList(fruits));\nfruitList.add("date"); // الآن يعمل بدون أخطاء
\n\n

هذه الحيلة هي الوسط الذهبي. تستخدم الكتابة القصيرة Arrays.asList، لكنك تحصل على مجموعة ديناميكية كاملة.

\n\n

الطريقة 2: Collections.addAll() — السرعة والتحكم

\n\n

إذا كنت تسعى للأداء أو تريد ببساطة تجنب النسخ المزدوج (أولاً إلى قائمة ثابتة الحجم، ثم إلى ArrayList)، هناك الطريقة Collections.addAll():

\n\n
String[] fruits = {"apple", "banana", "cherry"};\nArrayList<String> fruitList = new ArrayList<>(fruits.length);\nCollections.addAll(fruitList, fruits);
\n\n

ماذا يحدث هنا؟ نقوم فورًا بإنشاء ArrayList بالحجم الأولي المطلوب (لتجنب إعادة البناء غير الضرورية للمصفوفة الداخلية)، ثم ننسخ جميع العناصر في تمريرة واحدة. الطريقة addAll تعمل أسرع من حلقة for، لأنها تستدعي System.arraycopy() على مستوى منخفض.

\n\n

الإيجابيات:

\n
    \n
  • سرعة عالية — تقريبًا على مستوى النسخ المباشر للذاكرة.
  • \n
  • تحصل فورًا على ArrayList كامل مع إمكانية التعديل.
  • \n
  • يمكن تحديد سعة القائمة مسبقًا.
  • \n
\n\n

السلبيات:

\n
    \n
  • الكود أط

المدونات

توصيات الكتب