البرمجة

المصفوفات في جافا: دليل شامل

تعرف على المصفوفات (Arrays) في جافا

تُعد المصفوفات (Arrays) في لغة جافا أحد أهم البنى البياناتية الأساسية التي تُمكِّن المبرمج من تخزين مجموعة من العناصر من نفس النوع ضمن هيكل بياناتي واحد يمكن الوصول إلى عناصره بسهولة باستخدام مؤشر رقمي يبدأ من الصفر. تشكل المصفوفات حجر الأساس في العديد من التطبيقات الخوارزمية والبرمجية، حيث تُستخدم لتخزين القيم المرتبطة مثل العلامات الدراسية، درجات الحرارة، أو حتى الكائنات (Objects) في البرامج المعقدة.

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


تعريف المصفوفة في جافا

المصفوفة في جافا هي عبارة عن كائن (Object) من نوع خاص يُستخدم لتخزين قيم متعددة من نفس النوع. يمكن أن تكون هذه القيم من أنواع البيانات البدائية (Primitive Data Types) مثل int, double, char, boolean، أو من أنواع الكائنات (Objects).

الصيغة العامة لتعريف مصفوفة:

java
type[] arrayName;

أو

java
type arrayName[];

مثال على تعريف مصفوفة أعداد صحيحة:

java
int[] numbers;

لكن هذا لا يعني أن المصفوفة قد تم إنشاؤها فعليًا، إذ يتطلب إنشاء المصفوفة خطوة إضافية باستخدام الكلمة المفتاحية new.


إنشاء المصفوفة وتخصيصها

بمجرد إعلان اسم المصفوفة، يجب إنشاء كائن المصفوفة باستخدام new وتحديد حجمها:

java
numbers = new int[5];

بذلك يتم إنشاء مصفوفة يمكنها احتواء 5 عناصر من النوع int. جميع العناصر تُهيأ تلقائيًا بالقيم الافتراضية التي تعتمد على نوع البيانات، مثل:

نوع البيانات القيمة الافتراضية
int 0
double 0.0
boolean false
char ‘\u0000’
Object null

التهيئة المباشرة للمصفوفة

يمكن تهيئة المصفوفة بالقيم مباشرة عند تعريفها:

java
int[] numbers = {1, 2, 3, 4, 5};

في هذه الحالة، يتم إنشاء مصفوفة طولها 5 تحتوي على القيم المحددة دون الحاجة لاستخدام new.


الوصول إلى عناصر المصفوفة

يتم استخدام الفهارس (Index) للوصول إلى عناصر المصفوفة، بدءًا من الفهرس 0 وحتى length - 1، أي أن مصفوفة طولها 5 تحتوي على عناصر بفهارس من 0 إلى 4:

java
int first = numbers[0]; int last = numbers[numbers.length - 1];

ويمكن تغيير قيمة عنصر معين بسهولة:

java
numbers[2] = 10;

خصائص المصفوفات في جافا

  • الثبات في الطول: لا يمكن تغيير حجم المصفوفة بعد إنشائها.

  • التجانس في النوع: كل العناصر يجب أن تكون من نفس النوع.

  • السرعة في الوصول: الوصول لأي عنصر يتم في وقت ثابت (O(1)).

  • الكائنية: كل المصفوفات في جافا تعتبر كائنات من الفئة Object.


استخدام الحلقات مع المصفوفات

الحلقات تُعد من أكثر الأدوات فاعلية عند التعامل مع المصفوفات، خاصةً عند الرغبة في التكرار على كل العناصر. أكثر أنواع الحلقات شيوعًا:

الحلقة for

java
for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); }

حلقة foreach أو for-each

java
for (int num : numbers) { System.out.println(num); }

أنواع المصفوفات في جافا

المصفوفة الأحادية البُعد (One-Dimensional Array)

هي النوع الأساسي والأبسط من المصفوفات.

java
String[] names = {"Ali", "Sara", "Omar"};

المصفوفة متعددة الأبعاد (Multi-Dimensional Array)

هي مصفوفة تحتوي على مصفوفات كمحتوى، وأكثرها شيوعًا هي المصفوفة الثنائية البُعد (2D Array).

java
int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

للوصول إلى عنصر:

java
int val = matrix[1][2]; // يساوي 6

يمكن أيضًا إنشاء المصفوفة المتعددة الأبعاد يدويًا:

java
int[][] grid = new int[3][4]; // 3 صفوف و 4 أعمدة

تمرير المصفوفة إلى الدوال

يمكن تمرير المصفوفات إلى الدوال كما هو الحال مع أي كائن في جافا:

java
public static void printArray(int[] arr) { for (int i : arr) { System.out.println(i); } }

الاستخدام:

java
int[] data = {2, 4, 6, 8}; printArray(data);

المصفوفات ككائنات

جميع المصفوفات في جافا تُعتبر كائنات (Objects) من الكلاس Object، ويمكن التحقق من ذلك باستخدام:

java
System.out.println(numbers.getClass().getName());

النتيجة تكون عادة [I للمصفوفة من نوع int[]، و[Ljava.lang.String; للمصفوفة من نوع String[].


التعامل مع مصفوفات الكائنات

كما يمكن تخزين كائنات في المصفوفات تمامًا كما تُخزن الأنواع البدائية:

java
class Student { String name; int grade; } Student[] students = new Student[3]; students[0] = new Student(); students[1] = new Student();

وهكذا يمكن تنظيم البيانات المعقدة عبر مصفوفات الكائنات.


استخدام مكتبة java.util.Arrays

توفر مكتبة java.util.Arrays العديد من الأدوات المساعدة عند التعامل مع المصفوفات، مثل:

الطباعة:

java
System.out.println(Arrays.toString(numbers));

الترتيب:

java
Arrays.sort(numbers);

البحث الثنائي:

java
int index = Arrays.binarySearch(numbers, 3);

المقارنة:

java
boolean equal = Arrays.equals(arr1, arr2);

التهيئة:

java
Arrays.fill(numbers, 0); // يملأ المصفوفة بالقيمة 0

جدول مقارنة بين أنواع المصفوفات

النوع الحجم قابلية التغيير سهولة الوصول الاستخدام الشائع
مصفوفة أحادية البُعد ثابت لا عالية تخزين قيم خطية
مصفوفة ثنائية البُعد ثابت لا متوسطة تمثيل الجداول والمصفوفات
مصفوفة كائنات ثابت لا حسب المحتوى تنظيم بيانات معقدة

الأخطاء الشائعة مع المصفوفات

الخروج عن الحدود (ArrayIndexOutOfBoundsException)

من أكثر الأخطاء الشائعة هو محاولة الوصول إلى فهرس غير موجود في المصفوفة:

java
int[] arr = new int[5]; arr[5] = 10; // خطأ، لأن الفهارس من 0 إلى 4 فقط

نسيان التهيئة

المصفوفة يجب أن تُهيأ قبل الاستخدام، وإلا ستنتج عنها استثناء NullPointerException.

java
int[] arr; System.out.println(arr[0]); // خطأ، المصفوفة غير مهيأة

الأداء وكفاءة المصفوفات

المصفوفات تُعتبر ذات أداء عالٍ في جافا لعدة أسباب:

  • تخزينها في الذاكرة بشكل متتالٍ.

  • الوصول المباشر باستخدام الفهرس.

  • دعمها من قبل الجافا الافتراضية (JVM) بأداء محسَّن.

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


مقارنة المصفوفات مع ArrayList

الخاصية المصفوفة (Array) ArrayList
الحجم ثابت متغير
النوع نوع واحد يدعم أنواع الكائنات
الأداء أسرع أبطأ نسبيًا
التهيئة مباشرة يحتاج إلى كائن
التعامل مع الأنواع البدائية مدعومة مباشرة يجب تغليفها (Wrapper)

استخدام المصفوفات في التطبيقات الواقعية

في الواقع العملي، تُستخدم المصفوفات في العديد من السياقات، منها:

  • تخزين بيانات المستخدمين.

  • معالجة الصور (مصفوفات بكسل).

  • تخزين نتائج الاستعلامات.

  • تنفيذ الخوارزميات كالبحث، الترتيب، الدمج.

  • دعم البنى المعقدة مثل الجداول، الصفوف، والمصفوفات متعددة الأبعاد في الألعاب.


الخاتمة

تشكل المصفوفات جزءًا لا يتجزأ من البرمجة بلغة جافا، وتُعتبر من الأدوات الحيوية التي يجب أن يتقنها كل مبرمج سواء كان مبتدئًا أو محترفًا. تمكن المصفوفات من تنظيم البيانات بشكل خطي أو هيكلي بطريقة فعالة وسريعة. على الرغم من بساطتها الظاهرة، إلا أنها تُعد مدخلًا إلى مفاهيم أعقد في الخوارزميات وهياكل البيانات، مثل القوائم المرتبطة، الأكوام، الأشجار، والمزيد. إن الفهم العميق للمصفوفات يُشكّل قاعدة صلبة لتطوير برامج قوية وقابلة للتوسع.


المراجع:

  1. Oracle Java Documentation – https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html

  2. Geeks for Geeks – https://www.geeksforgeeks.org/arrays-in-java/