المصفوفات Arrays في Java

📖 الدرس 12 من 16 ⏱ 9 دقيقة قراءة 🎬 20:00 دقائق ✓ مجاني

لماذا نحتاج Array؟ وكيف ننشئها؟ وكيف نصل للعناصر؟ وكيف نستخدم length والحلقات للمرور عليها بكفاءة؟

ما هي المصفوفة ولماذا نحتاجها؟

تخيّل أنك تريد تخزين درجات 5 طلاب — بدون المصفوفة ستكتب:

❌ بدون مصفوفة — غير عملي
int s1 = 90;
int s2 = 85;
int s3 = 70;
int s4 = 100;
int s5 = 95;
// وماذا لو كانوا 100 طالب؟!

الحل: المصفوفة (Array) — متغير واحد يخزن داخله مجموعة قيم من نفس النوع، ويمكن الوصول لكل قيمة برقمها (الفهرس).

💬 تشبيه: المصفوفة مثل رفّ فيه خانات مرقّمة — كل خانة تحمل قيمة، ويمكنك الوصول لأي خانة برقمها مباشرةً.
🔢 int[]

أعداد صحيحة

📝 String[]

نصوص

💱 double[]

أعداد عشرية

⚖️ boolean[]

قيم منطقية

1

إنشاء Array — الطرق المختلفة

يوجد طريقتان رئيسيتان لإنشاء Array في Java:

الطريقة ① تعريف بالقيم مباشرة

int[]    scores = {90, 85, 70, 100, 95};
String[] names  = {"Ali", "Sara", "Ahmed"};
double[] prices = {9.99, 14.5, 3.75};

القيم معروفة مسبقاً — تُكتب مباشرة بين الأقواس المعقوفة مفصولة بفواصل.

الطريقة ② تحديد الحجم ثم التعبئة لاحقاً

// نحدد حجم المصفوفة فقط
int[] scores = new int[5];

// ثم نملأها لاحقاً
scores[0] = 90;
scores[1] = 85;
scores[2] = 70;
scores[3] = 100;
scores[4] = 95;

مفيدة عندما لا تعرف القيم مسبقاً — تنشئ المصفوفة فارغة ثم تملؤها.

💡

عند إنشاء int[] بالحجم فقط، تُملأ تلقائياً بـ 0 وللـ String بـ null.

2

الفهارس (Indexes) — أهم مفهوم في المصفوفات

⚠️

تنبيه مهم جداً

المصفوفات تبدأ من الفهرس صفر (0) وليس 1 — هذا يسبب أخطاء كثيرة للمبتدئين!

إذا كانت المصفوفة: int[] scores = {90, 85, 70, 100};

90
scores[0]
85
scores[1]
70
scores[2]
100
scores[3]
💥
scores[4]

خطأ!

Arrays.java
int[] scores = {90, 85, 70, 100};

System.out.println(scores[0]);  ← 90 (العنصر الأول)
System.out.println(scores[1]);  ← 85
System.out.println(scores[3]);  ← 100 (العنصر الأخير)

// يمكن تعديل قيمة عنصر موجود
scores[2] = 75;   ← غيّرنا 70 إلى 75

📊 قاعدة الفهارس

الترتيب الأول الثاني الثالث الأخير (n عناصر)
الفهرس [0] [1] [2] [n-1]

مصفوفة بـ 4 عناصر: الفهارس من [0] إلى [3] فقط — [4] خارج الحدود!

3

خاصية length — طول المصفوفة

كل مصفوفة لها خاصية مدمجة تُسمى length تُعطيك عدد عناصرها.

int[]    scores = {90, 85, 70, 100};
String[] names  = {"Ali", "Sara", "Ahmed"};

System.out.println(scores.length);  ← 4
System.out.println(names.length);   ← 3

// آخر عنصر دائماً عند الفهرس (length - 1)
System.out.println(scores[scores.length - 1]);  ← 100
🖥️
4
3
100
💡

قاعدة ذهبية: آخر فهرس صالح = length - 1 دائماً. مصفوفة بـ 4 عناصر → آخر فهرس = [3].

4

المرور على المصفوفة بالحلقات

قوة المصفوفات تظهر عند دمجها مع الحلقات — تستطيع معالجة آلاف العناصر بكود بسيط.

for عادية عندما تحتاج الفهرس

int[] scores = {90, 85, 70, 100};

for (int i = 0; i < scores.length; i++) {
    System.out.println("الطالب " + (i+1) + ": " + scores[i]);
}
🖥️
الطالب 1: 90
الطالب 2: 85
الطالب 3: 70
الطالب 4: 100
لاحظ: i < scores.length وليس <= — بهذا لا نتجاوز الحد!

for-each أسهل قراءة — عندما لا تحتاج الفهرس

int[] scores = {90, 85, 70, 100};

for (int s : scores) {
    System.out.println(s);
}
🖥️
90
85
70
100

تقرأ: "لكل عنصر s في مصفوفة scores — اطبعه"

🧮 مثال عملي — إيجاد المجموع والمعدل

int[] scores = {90, 85, 70, 100, 95};
int    sum    = 0;

for (int s : scores) {
    sum += s;
}

double avg = (double) sum / scores.length;
System.out.println("المجموع: " + sum);
System.out.println("المعدل: "  + avg);
🖥️
المجموع: 440
المعدل: 88.0
5

مصفوفة النصوص — String Array

المصفوفات لا تقتصر على الأرقام — يمكن استخدامها لتخزين النصوص والأسماء:

StringArray.java
String[] students = {"Ali", "Sara", "Ahmed", "Nora"};

// طباعة الأسماء مع أرقامها
for (int i = 0; i < students.length; i++) {
    System.out.println((i+1) + ". " + students[i]);
}
🖥️
1. Ali
2. Sara
3. Ahmed
4. Nora
6

أخطاء شائعة جداً في Arrays ⚠️

خطأ ١

البدء من فهرس 1 بدل 0

❌ خطأ — يبدأ من 1

for (int i = 1; i < scores.length; i++)

سيتجاهل العنصر الأول!

✅ صحيح

for (int i = 0; i < scores.length; i++)
خطأ ٢

استخدام <= بدل < — ArrayIndexOutOfBoundsException

❌ خطأ — تجاوز الحدود

i <= scores.length

مصفوفة 4 عناصر → [4] غير موجود!

✅ صحيح

i < scores.length

يتوقف عند [3] — آخر عنصر

خطأ ٣

وضع نوع بيانات مختلف في المصفوفة

❌ خطأ تجميع

int[] scores = {90, "Ali", 85};

نص داخل مصفوفة int!

✅ صحيح

int[] scores = {90, 85, 70}; String[] names = {"Ali"};
خطأ ٤

طباعة المصفوفة مباشرةً بدون حلقة

❌ يطبع عنوان الذاكرة وليس القيم

System.out.println(scores); // الناتج: [I@1b6d3586

استخدم حلقة أو Arrays.toString(scores)

7

من واقع عملي: حدود المصفوفة وما بعدها

المصفوفات أساس مهم، لكن من خبرتي، هناك حقيقتان عنها يجب أن تعرفهما مبكرًا لتتجنّب أكثر الأخطاء شيوعًا وتفهم لماذا توجد أدوات أخرى بعدها.

الأولى: تجاوز حدود المصفوفة هو أشهر خطأ توقّف فعلي ستراه في Java، واسمه ArrayIndexOutOfBounds. يحدث حين تطلب فهرسًا غير موجود. تذكّر دائمًا أن آخر فهرس صالح هو الطول ناقص واحد، لأن العدّ يبدأ من صفر.

الثانية: حجم المصفوفة في Java ثابت منذ إنشائها — لا تستطيع إضافة عنصر يتجاوز حجمها المحدّد. هذا قيد حقيقي واجهته كثيرًا، ولذلك في المشاريع التي يتغيّر فيها عدد العناصر، نستخدم بديلًا مرنًا اسمه ArrayList ينمو ويتقلّص حسب الحاجة. لا تنشغل به الآن، فقط اعلم أن المصفوفة ممتازة للحجم المعروف الثابت، وأن البديل المرن بانتظارك حين تحتاجه.

📋 ملخص الدرس

Array = متغير يخزن مجموعة قيم من نفس النوع

الفهارس تبدأ من [0] — آخر فهرس = [length-1]

.length تعطيك عدد العناصر

استخدم i < length في الحلقة — وليس <=

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

سنتعلم النصوص (String) — كيف نتعامل معها بطريقة صحيحة في Java وما هي أهم الدوال المدمجة للتعامل مع النصوص.

✍️ كتبه: أ. يوسف
معلّم حاسب آلي وأخصائي تقنية معلومات، حاصل على الماجستير في تقنية المعلومات، بخبرة تتجاوز 20 عامًا في تطوير البرمجيات وأمن المعلومات. تعرّف على خبرتي كاملة ←