مقدمة: لماذا نحتاج هذا أصلاً؟
\n\nتخيل موقفاً: أنت تكتب برنامجاً بلغة جافا يعالج قائمة بأسماء المستخدمين. تستخدم ArrayList<String> المريح — تضيف عناصر، تحذف، ترتب. كل شيء رائع. ولكن فجأة تظهر الحاجة لنقل هذه البيانات إلى مكتبة قديمة أو طريقة تقبل فقط مصفوفة من السلاسل النصية (String[]).
ألم مألوف؟ إذا كنت مبتدئاً في جافا، فبالتأكيد واجهت هذا. سؤال "تحويل 'ArrayList<String>' إلى 'String[]' في جافا" هو أحد أكثر الأسئلة شيوعاً على Stack Overflow. وهذا ليس من قبيل الصدفة. المجموعات (ArrayList) والمصفوفات (String[]) هما عالمين مختلفين في جافا. الأولى مرنة وديناميكية، والثانية سريعة وبسيطة. تعلم تحويل واحدة إلى الأخرى هو مهارة أساسية لأي مطور جافا.
\n\nفي هذه المقالة، سنستعرض جميع طرق تحويل ArrayList إلى مصفوفة سلاسل نصية، من الأبسط إلى المتقدم، مع أمثلة حية وشروحات. هيا بنا!
\n\nما هو ArrayList وString[]؟ نبذة مختصرة
\n\nقبل التحويل، دعنا نتأكد من فهمنا للفرق.
\n\nArrayList<String>
\nهذا جزء من إطار عمل المجموعات في جافا. هو:
\n- \n
- يتوسع ديناميكياً (لا حاجة لتحديد الحجم مسبقاً). \n
- يمتلك العديد من الطرق المدمجة:
add()،remove()،contains(). \n - يعمل فقط مع الكائنات (وليس مع الأنواع البدائية). \n
- يخزن العناصر ككائنات في الكومة. \n
String[] (مصفوفة سلاسل نصية)
\nهذا هيكل بيانات مدمج في اللغة. هو:
\n- \n
- له طول ثابت (يُحدد عند الإنشاء). \n
- ليس لديه طرق ملائمة للإضافة/الحذف. \n
- يعمل بشكل أسرع عند الوصول المباشر عبر الفهرس. \n
- يمكن أن يكون كائناً أو جزءاً من varargs. \n
لماذا نحتاج التحويل؟ ArrayList مناسب للعمل، والمصفوفة مناسبة للنقل إلى كود قديم أو لتحسين الأداء.
\n\nالطريقة رقم 1: الكلاسيكية — طريقة toArray()
\n\nالطريقة الأكثر شيوعاً وموصى بها. تحتوي فئة ArrayList على طريقة مدمجة toArray(). ولكن هناك فارق بسيط — فهي تُرجع مصفوفة من النوع Object[]. نحتاج String[]. لهذا، نستخدم النسخة المحملة بشكل زائد:
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])، تقوم جافا بإنشاء مصفوفة جديدة بالحجم المناسب ونوع يتوافق مع نوع المصفوفة الممررة.
لماذا new String[0] وليس new String[list.size()]؟
\nهذا موضوع جدلي. سابقاً، كان يُعتقد أن new String[list.size()] أسرع، لأنه لا يتطلب انعكاساً لإنشاء مصفوفة جديدة. لكن أجهزة جافا الافتراضية الحديثة (Java 6+) تحسّن هذه النقطة. علاوة على ذلك، في Java 11+، تجعل طريقة toArray(IntFunction) هذا النقاش قديماً. نصيحتنا للمبتدئين: استخدموا new String[0] — الكود أنظف وأكثر قابلية للقراءة.
الطريقة رقم 2: النسخ اليدوي (للفهم)
\n\nإذا كنت تريد فهم ما يحدث "تحت الغطاء"، يمكنك إجراء التحويل يدوياً. هذا ليس الخيار الأفضل للإنتاج، لكنه مثال تعليمي ممتاز:
\n\nArrayList<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++)