من ArrayList<String> إلى String[] في جافا: دليل بسيط

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

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

ابدأ الدورة

مقدمة: لماذا نحتاج هذا أصلاً؟

\n\n

تخيل موقفاً: أنت تكتب برنامجاً بلغة جافا يعالج قائمة بأسماء المستخدمين. تستخدم ArrayList<String> المريح — تضيف عناصر، تحذف، ترتب. كل شيء رائع. ولكن فجأة تظهر الحاجة لنقل هذه البيانات إلى مكتبة قديمة أو طريقة تقبل فقط مصفوفة من السلاسل النصية (String[]).

\n\n

ألم مألوف؟ إذا كنت مبتدئاً في جافا، فبالتأكيد واجهت هذا. سؤال "تحويل 'ArrayList<String>' إلى 'String[]' في جافا" هو أحد أكثر الأسئلة شيوعاً على Stack Overflow. وهذا ليس من قبيل الصدفة. المجموعات (ArrayList) والمصفوفات (String[]) هما عالمين مختلفين في جافا. الأولى مرنة وديناميكية، والثانية سريعة وبسيطة. تعلم تحويل واحدة إلى الأخرى هو مهارة أساسية لأي مطور جافا.

\n\n

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

\n\n

ما هو ArrayList وString[]؟ نبذة مختصرة

\n\n

قبل التحويل، دعنا نتأكد من فهمنا للفرق.

\n\n

ArrayList<String>

\n

هذا جزء من إطار عمل المجموعات في جافا. هو:

\n
    \n
  • يتوسع ديناميكياً (لا حاجة لتحديد الحجم مسبقاً).
  • \n
  • يمتلك العديد من الطرق المدمجة: add()، remove()، contains().
  • \n
  • يعمل فقط مع الكائنات (وليس مع الأنواع البدائية).
  • \n
  • يخزن العناصر ككائنات في الكومة.
  • \n
\n\n

String[] (مصفوفة سلاسل نصية)

\n

هذا هيكل بيانات مدمج في اللغة. هو:

\n
    \n
  • له طول ثابت (يُحدد عند الإنشاء).
  • \n
  • ليس لديه طرق ملائمة للإضافة/الحذف.
  • \n
  • يعمل بشكل أسرع عند الوصول المباشر عبر الفهرس.
  • \n
  • يمكن أن يكون كائناً أو جزءاً من varargs.
  • \n
\n\n

لماذا نحتاج التحويل؟ ArrayList مناسب للعمل، والمصفوفة مناسبة للنقل إلى كود قديم أو لتحسين الأداء.

\n\n

الطريقة رقم 1: الكلاسيكية — طريقة toArray()

\n\n

الطريقة الأكثر شيوعاً وموصى بها. تحتوي فئة ArrayList على طريقة مدمجة toArray(). ولكن هناك فارق بسيط — فهي تُرجع مصفوفة من النوع Object[]. نحتاج String[]. لهذا، نستخدم النسخة المحملة بشكل زائد:

\n\n
ArrayList<String> list = new ArrayList<>();\nlist.add("تفاحة");\nlist.add("موز");\nlist.add("كرز");\n\n// تحويل إلى String[]\nString[] array = list.toArray(new String[0]);
\n\n

كيف يعمل هذا؟

\n

الطريقة toArray(T[] a) تقبل مصفوفة من النوع T. إذا كانت المصفوفة الممررة كبيرة بما يكفي لاستيعاب جميع عناصر القائمة، يتم نسخها إليها. إذا لم تكن (كما في حالتنا مع new String[0])، تقوم جافا بإنشاء مصفوفة جديدة بالحجم المناسب ونوع يتوافق مع نوع المصفوفة الممررة.

\n\n

لماذا new String[0] وليس new String[list.size()]؟

\n

هذا موضوع جدلي. سابقاً، كان يُعتقد أن new String[list.size()] أسرع، لأنه لا يتطلب انعكاساً لإنشاء مصفوفة جديدة. لكن أجهزة جافا الافتراضية الحديثة (Java 6+) تحسّن هذه النقطة. علاوة على ذلك، في Java 11+، تجعل طريقة toArray(IntFunction) هذا النقاش قديماً. نصيحتنا للمبتدئين: استخدموا new String[0] — الكود أنظف وأكثر قابلية للقراءة.

\n\n

الطريقة رقم 2: النسخ اليدوي (للفهم)

\n\n

إذا كنت تريد فهم ما يحدث "تحت الغطاء"، يمكنك إجراء التحويل يدوياً. هذا ليس الخيار الأفضل للإنتاج، لكنه مثال تعليمي ممتاز:

\n\n
ArrayList<String> list = new ArrayList<>();\nlist.add("قط");\nlist.add("كلب");\nlist.add("هامستر");\n\n// إنشاء مصفوفة بالحجم المطلوب\nString[] array = new String[list.size()];\n\n// ملؤها في حلقة\nfor (int i = 0; i < list.size(); i++)                

المدونات

توصيات الكتب