النصوص String

20:00 دقائق مجاني

إنشاء النصوص، دمجها، طولها، استخراج الحروف، وأهم نقطة: المقارنة الصحيحة باستخدام equals بدل ==.

ما هو String ولماذا هو مختلف؟

النصوص (Strings) من أكثر الأشياء استخدامًا في أي برنامج — أسماء، رسائل، كلمات مرور، عناوين. في Java نمثّل النص بالنوع String.

لكن String في Java ليس نوعاً بدائياً كـ int أو double — بل هو كائن (Object). وهذا يجعل المقارنة بين النصوص مختلفة تماماً عن مقارنة الأرقام — وهو أكثر خطأ يقع فيه المبتدئون!

🔢

int, double, boolean

أنواع بدائية — تُخزَّن مباشرةً كقيم. المقارنة بـ ==

📝

String

كائن (Object) — يُخزَّن في الذاكرة بطريقة مختلفة. المقارنة بـ .equals()

إنشاء String ودمج النصوص

إنشاء String بسيط — نضع النص بين علامتي اقتباس مزدوجتين:

StringBasics.java
// إنشاء نصوص
String firstName = "Ahmed";
String lastName  = "Ali";

// دمج النصوص باستخدام +
String fullName = firstName + " " + lastName;
System.out.println(fullName);

// دمج نص مع رقم
int age = 25;
System.out.println("اسمي " + firstName + " وعمري " + age);
🖥️
Ahmed Ali
اسمي Ahmed وعمري 25
💡

علامة + مع النصوص تعني دمج وليس جمعاً رياضياً. إذا كتبت "5" + "3" الناتج "53" وليس 8!

أهم الدوال المدمجة في String

String في Java يأتي مع دوال مدمجة كثيرة جداً — إليك أهمها:

.length() عدد الحروف في النص
String name = "Ahmed";
System.out.println(name.length()); ← 5
.charAt(i) الحرف عند الفهرس i (يبدأ من 0)
System.out.println(name.charAt(0)); ← A
System.out.println(name.charAt(4)); ← d
A
[0]
h
[1]
m
[2]
e
[3]
d
[4]
.toUpperCase() تحويل لحروف كبيرة
System.out.println(name.toUpperCase()); ← AHMED
System.out.println(name.toLowerCase()); ← ahmed
.contains() هل النص يحتوي على كلمة معينة؟
String email = "ahmed@gmail.com";
System.out.println(email.contains("gmail")); ← true
.trim() إزالة المسافات من الطرفين
String s = " Hello ";
System.out.println(s.trim()); ← "Hello"
.substring() استخراج جزء من النص
String name = "Ahmed Ali";
System.out.println(name.substring(0, 5)); ← "Ahmed"

أهم نقطة — مقارنة النصوص: equals بدل ==

⚠️

أكثر خطأ شائع في Java!

مقارنة النصوص باستخدام == قد تعطيك نتائج خاطئة ومربكة.

لفهم السبب، يجب أن تعرف أن == في Java تقارن عناوين الذاكرة وليس المحتوى:

تشبيه بسيط جداً:

تخيّل كتابَين، كلاهما يحتوي نفس النص "Hello".
== يسأل: "هل هذان نفس الكتاب المادي؟" — الجواب لا.
.equals() يسأل: "هل محتوى الكتابين متطابق؟" — الجواب نعم.

StringCompare.java
String a = new String("test");
String b = new String("test");

// == يقارن العناوين — قد يكون false!
System.out.println(a == b);            ← false

// equals يقارن المحتوى — دائماً صحيح
System.out.println(a.equals(b));       ← true ✅

// مقارنة بدون حساسية للحروف
System.out.println(a.equalsIgnoreCase("TEST"));  ← true ✅

❌ لا تستخدم == للنصوص

if (answer == "yes") {
// قد لا يعمل صح!
}

✅ استخدم equals دائماً

if (answer.equals("yes")) {
// يعمل دائماً بشكل صحيح
}

📋 القاعدة الذهبية

نوع البيانات طريقة المقارنة مثال
أعداد (int, double) == 5 == 5
نصوص (String) .equals() a.equals(b)
نصوص (بدون حساسية) .equalsIgnoreCase() a.equalsIgnoreCase("YES")

مثال عملي — تطبيق كامل

نطبّق ما تعلمناه في مثال واقعي — التحقق من كلمة مرور ومعالجة إدخال المستخدم:

StringExample.java
String username = "  Ahmed  ";
String password = "java123";

// إزالة المسافات الزائدة
username = username.trim();

// التحقق من اسم المستخدم
if (username.equals("Ahmed")) {
    System.out.println("اسم المستخدم صحيح ✅");
}

// التحقق من كلمة المرور
if (password.length() >= 6) {
    System.out.println("كلمة المرور قوية ✅");
} else {
    System.out.println("كلمة المرور ضعيفة ❌");
}

// طباعة معلومات
System.out.println("الاسم: " + username.toUpperCase());
System.out.println("طول الاسم: " + username.length() + " حروف");
🖥️
اسم المستخدم صحيح ✅
كلمة المرور قوية ✅
الاسم: AHMED
طول الاسم: 5 حروف

أخطاء شائعة في String ⚠️

خطأ ١

كتابة string بحرف صغير

❌ خطأ تجميع

string name = "Ahmed";

✅ صحيح — S كبيرة

String name = "Ahmed";
خطأ ٢

مقارنة النصوص بـ == بدل equals

❌ غير موثوق

if (a == b)

✅ دائماً صحيح

if (a.equals(b))
خطأ ٣

نسيان علامات الاقتباس

❌ خطأ

String name = Ahmed;

✅ صحيح

String name = "Ahmed";
خطأ ٤

استدعاء دالة على null

❌ NullPointerException

String name = null; name.length(); // خطأ — name فارغة!

تحقق أن المتغير ليس null قبل استدعاء أي دالة

📋 ملخص الدرس

String كائن (Object) — يبدأ بحرف كبير دائماً

الدمج بـ + — والمقارنة بـ .equals()

length() للطول و charAt(i) لاستخراج حرف

trim() و toUpperCase() و contains()

⏭️ في الدرس القادم:

سنطبّق كل ما تعلمناه في مشروع صغير متكامل يجمع المتغيرات، الشروط، الحلقات، الدوال، والكلاسات معاً — لترى كيف تعمل جميع المفاهيم في برنامج حقيقي! 🚀

الدرس التالي العودة للسابق