Menu
flag Ar iconالعربيةdown icon

السلاسل النصية في Java: الإنشاء والدمج واستخدام دوال String

كيف تعمل السلاسل النصية في Java: إنشاؤها، ودمجها باستخدام +، ولماذا هي غير قابلة للتغيير (immutable)، ومقارنتها باستخدام equals، ودوال String اليومية مثل length وsubstring وreplace.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

ما هي السلسلة النصية (String)

تحمل String سلسلة من الأحرف - نصًّا مثل اسم أو جملة أو سطر مقروء من ملف. رأيت String مدرجة ضمن الأنواع المرجعية في الصفحة السابقة؛ وهنا ستتعامل معها فعليًّا. تكتب السلسلة النصية الحرفية (literal) بعلامتي اقتباس مزدوجتين (علامتا الاقتباس المفردتان محجوزتان لحرف char واحد):

تُرجع name.length() عدد الأحرف - 3 بالنسبة إلى "Ada". إنها استدعاء لدالة، لذا تحتاج إلى الأقواس.

دمج السلاسل النصية

يلصق العامل + السلاسل النصية معًا. إذا كان أي من طرفي + سلسلة نصية، فإن الطرف الآخر يُحوَّل إلى نص تلقائيًّا، لذا يمكنك مزج الأرقام والقيم المنطقية (boolean) دون أي عمل إضافي:

انتبه إلى أمر مهم: لأن + يُقيَّم من البداية إلى النهاية، فإن "" + 1 + 2 يُنتج "12" (سلسلة نصية + int، ثم سلسلة نصية + int)، لكن 1 + 2 + "" يُنتج "3" (يُجمع العددان الصحيحان أولًا، ثم يتحوّلان إلى نص). عند الشك، ضع العمليات الحسابية بين قوسين.

السلاسل النصية غير قابلة للتغيير

هذا أهم ما يجب فهمه عن السلاسل النصية في Java: لا تتغير String أبدًا بعد إنشائها. كل دالة "تعدّل" سلسلة نصية تُرجع في الواقع سلسلة جديدة تمامًا وتترك الأصلية دون مساس. لذا إذا نسيت التقاط القيمة المُرجَعة، فلن يحدث شيء:

يحسب الاستدعاء الأول "HELLO" ثم يتخلص منها فورًا. السطر الثاني وحده، الذي يُسند القيمة من جديد إلى s، هو الذي يُحدث أثرًا ظاهرًا. يقع في هذا الفخ كل المبرمجين تقريبًا مرة واحدة على الأقل.

مقارنة السلاسل النصية

استخدم .equals() لمقارنة محتوى سلسلتين نصيتين. اللجوء إلى == هو الخطأ الكلاسيكي للمبتدئين: يسأل == "هل هما الكائن نفسه في الذاكرة؟"، وليس "هل يحملان النص نفسه؟":

تكون a == b هنا false لأن new String(...) يفرض إنشاء كائن منفصل. قارن دائمًا قيم السلاسل النصية باستخدام .equals() (أو .equalsIgnoreCase() لتجاهل حالة الأحرف). من الحيل المفيدة لتجنّب الانهيار عندما يكون أحد الطرفين قد يساوي null أن تستدعي .equals على السلسلة الحرفية: "yes".equals(input) لا ترمي استثناءً أبدًا حتى لو كانت input تساوي null.

دوال String اليومية

لأن السلاسل النصية غير قابلة للتغيير، فإن كلًّا من هذه الدوال يُرجع سلسلة جديدة (أو قيمة) بدلًا من تعديل الأصلية. هذه هي الدوال التي ستلجأ إليها باستمرار:

لاحظ التسلسل (chaining): تعمل s.trim().toUpperCase() لأن trim() تُرجع سلسلة نصية، ثم تستدعي عليها toUpperCase(). وsubstring أداة أساسية أخرى - تأخذ فهرس البداية (شامل) وفهرس النهاية الاختياري (غير شامل):

تبدأ الفهارس من الصفر، لذا تلتقط substring(0, 4) الأحرف من 0 إلى 3. طلب فهرس يتجاوز النهاية يرمي استثناء StringIndexOutOfBoundsException.

بناء السلاسل النصية داخل حلقة

الدمج باستخدام + لا بأس به لبضع قطع، لكن القيام به داخل حلقة كبيرة بطيء - فكل + يُنشئ سلسلة جديدة وينسخ كل شيء. عندما تجمّع نصًّا داخل حلقة، استخدم StringBuilder، الذي يُعدّل مخزنًا مؤقتًا في مكانه وينتج السلسلة النهائية مرة واحدة في النهاية:

تُرجع append الباني (builder) نفسه، فتتسلسل الاستدعاءات. استدعِ .toString() في النهاية للحصول على String عادية. للدمج لمرة واحدة، التزم بـ +؛ ولتجميع قطع كثيرة، يكون StringBuilder هو الأداة المناسبة.

التالي: تنسيق السلاسل النصية

يصبح الدمج فوضويًّا بمجرد أن تحتاج إلى أعمدة منتظمة المحاذاة، أو خانات عشرية ثابتة، أو أرقام محشوّة بأصفار. تستخدم دالتا Java String.format وprintf قالبًا يحتوي على عناصر نائبة % للتعامل مع كل ذلك بأناقة - وهذا موضوع الصفحة التالية.

الأسئلة الشائعة

كيف تقارن سلسلتين نصيتين في Java؟

استخدم .equals() لمقارنة المحتوى: تُرجع a.equals(b) القيمة true عندما تتطابق الأحرف. لا تستخدم == لمقارنة قيم السلاسل النصية - فالعامل == يقارن مراجع الكائنات، لذا قد يُرجع false لسلسلتين تحملان النص نفسه. استخدم .equalsIgnoreCase() عندما لا يجب أن تهم حالة الأحرف (كبيرة أو صغيرة).

لماذا تكون السلاسل النصية في Java غير قابلة للتغيير (immutable)؟

بمجرد إنشاء كائن String لا يمكن أن يتغير أبدًا. الدوال مثل replace أو toUpperCase تُرجع سلسلة جديدة بدلًا من تعديل الأصلية. عدم القابلية للتغيير يجعل السلاسل النصية آمنة للمشاركة والتخزين المؤقت، لكنه يعني أنه يجب عليك إسناد النتيجة: s = s.toUpperCase();. إذا استدعيت دالة وتجاهلت قيمتها المُرجَعة، فلن يحدث أي شيء.

كيف تحصل على طول سلسلة نصية في Java؟

استدعِ الدالة .length(): تُرجع "hello".length() القيمة 5. لاحظ أنها دالة بأقواس على String، بخلاف المصفوفات حيث يكون length حقلًا بلا أقواس (arr.length).

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن