القائمة الرئيسية

الصفحات

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

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

مصفوفة: تعني Array في البرمجة. و المصفوفة عبارة عن كائن يحتوي مجموعة عناصر من نفس النوع تتخزن بجوار بعضها في الذاكرة.
بمعنى آخر المصفوفة عبارة عن كائن يمكنه تخزين عدة قيم من نفس النوع.

عناصر المصفوفة تتميز عن بعضها من خلال رقم محدد يعطى لكل عنصر يسمى index. أول عنصر فيها يتم تخزينه في الـ index رقم 0.

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


فوائد الـ Array

  • تقليل عدد المتغيرات المتشابهة, فمثلاً إذا كنا نريد تعريف 10 متغيرات نوعهم int, نقوم بتعريف مصفوفة واحدة تتألف من 10 عناصر.

  • تطوير الكود, إذا قمت بتخزين المعلومات داخل مصفوفة, تستطيع تعديلهم, مقارنتهم أو جلبهم كلهم دفعة واحدة بكود صغير جداً باستخدام الحلقات.

  • تستطيع الوصول لأي عنصر من خلال الـ index.



المشكلة الوحيدة في الـ Array

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



مصطلحات تقنية

الفرق بين Declare Array و Create Array هو:

  • Declare Array تعني تعريف نوع في الذاكرة يفهمه المعالج على أنه مصفوفة.

  • Create Array تعني تحديد عدد عناصر المصفوفة و إعطاء قيمة أولية لكل عنصر فيها.

ملاحظة: لا تستطيع التعامل مع المصفوفة إذا لم تفعل لها Create.

تعريف مصفوفة

تعريف مصفوفة جديدة يسمى Declare Array

يمكنك تعريف مصفوفة جديدة بثلاث طرق:

// يمكنك تعريفها هكذا
datatype[] arrayRefVar;         // هذا الأسلوب المفضل في جافا

// أو هكذا
datatype []arrayRefVar;

// أو هكذا
datatype arrayRefVar[];

  • datatype: هو نوع المصفوفة التي سيتم تعريفها.

  • []: هو من كم بعد تتألف المصفوفة.


أمثلة

// double هنا قمنا بتعريف مصفوفة ذات بعد واحد, نوعها
	  double[] doubleArray;

	  // int هنا قمنا بتعريف مصفوفة ذات بعدين, نوعها
	  int[][] intArray;

	  // String هنا قمنا بتعريف مصفوفة ذات بعد واحد, نوعها
	  String[] stringArray; 
	

إنشاء مصفوفة في جافا

إنشاء مصفوفة جديدة يعني Create Array في اللغة الإنجليزية.

إذا أردت أن تعرف أي مصفوفة فعندك طريقتين:

  • تنشئ المصفوفة و تعطيها القيم لاحقاً.

  • تنشئ المصفوفة و تعطيها القيم مباشرةً عند تعريفها.



طريقة إنشاء مصفوفة و إعطائها القيم لاحقاً

arrayRefVar = new datatype[size];
  • :arrayRefVar: هو إسم المصفوفة التي يجب أن تكون معرفة سابقاً.

  • new: تقوم بتوليد قيم أولية لجميع عناصر المصفوفة, تعطيهم القيمة صفر كقيمة أولية.

  • datatype: هو نوع القيم الأولية التي سيتم توليدها.

  • size: هو عدد عناصر المصفوفة.



طريقة إنشاء مصفوفة و إعطائها قيم أولية مباشرةً عند إنشائها

arrayRefVar = { value0, value1, ..., valuek };
  • arrayRefVar: هو إسم المصفوفة التي يجب أن تكون معرفة سابقاً.

  • value0 و value1 و valuek: عبارة عن القيم التي نعطيها للمصفوفة.

تعريف مصفوفة و إعطاءها قيم أولية بكود أقل

يمكنك أن تفعل Declaring و Creating و Assigning لمصفوفة جديدة في جملة واحدة.
يمكنك تحديد عدد عناصرها فقط عند تعريفها, و عندها ستعطى القيمة صفر لجميع عناصرها كقيمة أولية.

datatype[] arrayRefVar = new datatype[size];

و يمكنك إعطائها قيم أولية مباشرةً عند تعريفها, و عندها تتخزن كل قيمة في عنصر, و هكذا يتحدد عدد عناصرها.

datatype[] arrayRefVar = { value0, value1, ..., valuek };

يمكنك الوصول لعناصر المصفوفة من خلال الـ index.
يتم تخزين عناصر المصفوفة إبتداءاً من الـ index رقم 0 إلى الـ index رقم length-1.
بمعنى آخر العنصر الأول في المصفوفة يحمل الـ index رقم 0, و العنصر الآخير فيها يحمل index رقم length-1.


ملاحظة

القيمة الإفتراضية صفر تعطى حسب نوع المصفوفة.
إذا كان نوع المصفوفة int أو longالقيمة الإفتراضية التي ستعطى لجميع عناصر المصفوفة هي 0.
إذا كان نوع المصفوفة double أو floatالقيمة الإفتراضية التي ستعطى لجميع عناصر المصفوفة هي 0.0.
إذا كان نوع المصفوفة String القيمة الإفتراضية التي ستعطى لجميع عناصر المصفوفة هي null.

شكل المصفوفة في الذاكرة

لنفترض الآن أننا قمنا بتعريف مصفوفة نوعها int, إسمها a, تتألف من 5 عناصر.

int[] a = { 10, 20, 30, 40, 50 }; 
  

يمكنك تصور شكل المصفوفة a في الذاكرة كالتالي.


بما أن المصفوفة تتألف من 5 عناصر, تم إعطاء العناصر أرقام index بالترتيب من 0 إلى 4.

إذاً هنا أصبح عدد عناصر المصفوفة يساوي 5 و هو ثابت لا يمكن تغييره لاحقاً في الكود.
و يمكنك إستخدام أرقام الـ index لتصل لجميع عناصر المصفوفة سواء لعرض القيم أو لتغييرها.


في المثال التالي, قمنا بتعريف مصفوفة, ثم غيرنا قيمة العنصر الأول, ثم عرضناها, من خلال الـ index الخاص بالعنصر.
بعدها, إستخدامنا الخاصية length الموجودة في جافا لطباعة عدد عناصر المصفوفة.

مثال

public class Main {

	  public static void main(String[] args) {

	  int[] a = { 10, 20, 30, 40, 50 };               // هنا قمنا بتعريف مصفوفة تتألف من 5 عناصر

	  a[0] = 99;                                      // هنا قمنا بتغيير قيمة العنصر الأول

	  System.out.println("a[0] = " + a[0]);           // هنا عرضنا قيمة العنصر الأول
	  System.out.println("a.length = " + a.length);   // هنا عرضنا عدد عناصر المصفوفة

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل

a[0] = 99
	  a.length = 5
	

مثال شامل حول التعامل مع المصفوفات

سنقوم الآن بكتابة برنامج شامل لكل المفاهيم التي ذكرناها في المصفوفات في جافا.

الخطوات التي سنقوم بتنفيذها هي التالية:

  1. تعريف مصفوفة فارغة نوعها int, إسمها numbers, تتألف من 5 عناصر.

  2. عرض قيمها الأولية باستخدام حلقة.

  3. إعطاء قيمة لكل عنصر فيها.

  4. عرض جميع قيمها من جديد باستخام حلقة

مثال

public class Main {

	  public static void main(String[] args) {

	  // 1- هنا قمنا بتعريف المصفوفة
	  int[] numbers = new int[5];

	  // 2- هنا قمنا بعرض قيم جميع عناصرها
	  for(int i=0; i<numbers.length; i++)
	  {
	  System.out.println("numbers[" + i + "]: " + numbers[i]);
	  }

	  // 3- هنا قمنا يتغيير قيم جميع عناصرها
	  numbers[0] = 1000;
	  numbers[1] = 2000;
	  numbers[2] = 3000;
	  numbers[3] = 4000;
	  numbers[4] = 5000;

	  System.out.println();

	  // 4- هنا قمنا بعرض قيم جميع عناصرها
	  for(int i=0; i<numbers.length; i++)
	  {
	  System.out.println("numbers[" + i + "]: " + numbers[i]);
	  }

	  }
	  }
	

سنحصل على النتيجة التالية عند التشغيل

numbers[0]: 0
	  numbers[1]: 0
	  numbers[2]: 0
	  numbers[3]: 0
	  numbers[4]: 0

	  numbers[0]: 1000
	  numbers[1]: 2000
	  numbers[2]: 3000
	  numbers[3]: 4000
	  numbers[4]: 5000
	

الحلقة foreach في جافا

إبتداءاً من الإصدار 1.5 في جافا, قدم لنا حلقة for جديدة إسمها foreach loop.
هذه الحلقة تسمح لك بالمرور على جميع عناصر المصفوفة دون الحاجة لتعريف عداد و تحديد أين يبدأ و أين ينتهي.


طريقة تعريف الحلقة foreach

في البداية نحن لا نكتب foreach بل نكتب for.
الإختلاف بين foreach و for التقليدية يظهر فقط بين القوسين, لاحظ الـ syntax.

for( element: array ) {
    // statements
}

  • element: هو متغير عادي نقوم بتعريفه بداخل الحلقة و نعطيه نفس نوع المصفوفة التي نضعها بعد النقطتين, لأنه في كل دورة سيقوم بتخزين قيمة عنصر من عناصرها, لذلك يجب وضع نوعه مثل نوعها.

  • array: هي المصفوفة التي نريد الوصول لجميع عناصرها.

  • statements: هي جميع الأوامر الموضوعة في الحلقة و هي تتنفذ في كل دورة.

إذاً هنا تقوم الحلقة بالمرور على جميع عناصر المصفوفة بالترتيب من العنصر الأول إلى العنصر الأخير, و في كل دورة تقوم بتخزين قيمة العنصر في المتغير الذي قمنا بتعريفه.


سنقوم الآن بكتابة برنامج بسيط يعرض قيم جميع عناصر مصفوفة باستخدام الحلقة foreach.

مثال

public class Main {

	  public static void main(String[] args) {

	  // هنا قمنا بتعريف المصفوفة
	  int[] numbers = { 1000, 2000, 3000, 4000, 5000 };

	  // element في المتغير numbers هنا في كل دورة سيتم تخزين قيمة عنصر من عناصر المصفوفة
	  for(int element: numbers)
	  {
	  System.out.println(element);   // element هنا سيتم عرض القيمة التي تخزنت في المتغير
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل

1000
	  2000
	  3000
	  4000
	  5000
	

تعامل الدوال مع المصفوفات

سنتكلم الآن عن نقتطين أساسيتين:

  • تمرير المصفوفة كـ argument للدالة.

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


تمرير المصفوفة كـ argument للدالة

سنقوم بتعريف دالة تأخذ مصفوفة كباراميتر, مهمة هذه الدالة ستكون فقط طباعة جميع قيم عناصر المصفوفة.
ثم سنقوم بإستدعاء هذه الدالة مرتين, لأننا سنعلمك طريقتين لتمرير مصفوفة كـ argument.

مثال

public class Main {

	  // 1- argument هنا قمنا بتعريف دالة تطبع محتوى أي مصفوفة نمررها لها كـ
	  public static void printArray(int[] array) {
	  for (int i=0; i<array.length; i++) {
	  System.out.print(array[i] + " ");
	  }
	  }

	  public static void main(String[] args) {

	  // 2- هنا قمنا بتعريف مصفوفة
	  int[] numbers = { 1000, 2000, 3000, 4000, 5000 };

	  // 3- هنا قمنا باستدعاء الدالة و مررنا لها المصفوفة
	  printArray(numbers);

	  System.out.println();

	  // 4- هنا قمنا باستدعاء الدالة و أنشأنا مصفوفة بداخلها. ستفهم هذا الأسلوب في دروس لاحقة
	  printArray(new int[] {11, 12, 13, 14, 15});

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل

1000 2000 3000 4000 5000
	  11 12 13 14 15
	


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

سنقوم بتعريف دالة تأخذ مصفوفة كباراميتر و ترجعها معكوسة, ثم سنقوم بإستدعاء هذه الدالة.
ستلاحظ أننا قمنا بتعريف عدادين في الحلقة for, لأننا أردننا أن نلفت إنتباهك أيضاً أنه بإمكانك تعريف أكثر من عداد بداخل الحلقةfor.

مثال

public class Main {

	  // 1- بالمقلوب argument هنا قمنا بتعريف دالة ترجع محتوى المصفوفة نمررها لها كـ
	  public static int[] reverseArray(int[] array) {

	  int[] result = new int[array.length];

	  for (int i=0, j=result.length-1; i<array.length; i++, j--) {
	  result[j] = array[i];
	  }

	  return result;
	  }

	  public static void main(String[] args) {

	  // 2- هنا قمنا بتعريف مصفوفة
	  int[] numbers = { 1000, 2000, 3000, 4000, 5000 };

	  // 3- بالمقلوب numbers هنا قمنا بتعريف مصفوفة فارغة, سنستخدمها لحفظ قيم المصفوفة
	  int[] reversedNumbers;

	  // 4- reversedNumbers هنا قمنا بتخزين المصفوفة المقلوبة التي سترجعها الدالة في المصفوفة
	  reversedNumbers = reverseArray(numbers);

	  // 5- للتأكد فقط reversedNumbers هنا بعرض قيم المصفوفة
	  for (int i=0; i<reversedNumbers.length; i++) {
	  System.out.print(reversedNumbers[i] + " ");
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل

5000 4000 3000 2000 1000
	

دوال جاهزة للتعامل مع المصفوفات

الكلاس Arrays هو كلاس جاهز في جافا, يحتوي على دوال نوعها static تطبق على جميع أنواع البيانات البدائية و تستخدم للترتيب, البحث, المقارنة, و لإعطاء قيم لعناصر المصفوفة, ذكرنا لك بعضها في هذا الجدول.

إسم الدالة مع تعريفها
public static boolean equals(Object[] a1, Object[] a2) تقارن المصفوفتين اللتين نمررهما لها مكان الباراميترين a1 و a2.
ترجع true إذا كانتا متساويتين في الحجم و المحتوى. غير ذلك ترجع false.
تابع القراءة »
public static void sort(Object[] a) ترتب قيم المصفوفة التي نمررها لها مكان الباراميتر a بشكل تصاعدي (ascending).
تابع القراءة »
public static void fill(Object[] a, Object val) تستخدم لوضع قيمة أولية في جميع عناصر المصفوفة.
مكان الباراميتر a نمرر المصفوفة التي سيتم وضع قيم أولية لعناصرها. و مكان الباراميتر val نمرر القيمة التي سيتم وضعها لهم.
تابع القراءة »

الكلاس System يحتوي أيضاً على دوال للتعامل مع المصفوفات, نذكر منها.

إسم الدالة مع تعريفها
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) تستخدم لنسخ محتوى مصفوفة و وضعه في مصفوفة أخرى.
تابع القراءة »

Java الدالة equals()

تعريفها

تقارن المصفوفتين اللتين نمررهما لها مكان الباراميترين a1 و a2.
ترجع true إذا كانتا متساويتين في الحجم و المحتوى. غير ذلك ترجع false.

ملاحظة: في حال كانت المصفوفتان لا تحتويان أي قيمة ( أي قيمتهما تساوي null ) و قمنا بمقارنتهما سيكون الجواب true لأنهما متساويتين في الحجم و المحتوى.



بناؤها

                  public static boolean equals(Object[] a1, Object[] a2) 
  


باراميترات

  • مكان الباراميتر a1 نمرر مصفوفة من أي نوع.

  • مكان الباراميتر a2 نمرر مصفوفة من أي نوع.



قيمة الإرجاع

ترجع true إذا كانت المصفوفتين اللتين مررناها لها متساويتين في الحجم و المحتوى.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  Object arr1[] = { 0, 1, 2, 3, 4, 5};
	  Object arr2[] = { 0, 1, 2, 3, 4, 5};
	  Object arr3[] = { 0, 1, 2, 3};

	  System.out.println( Arrays.equals(arr1, arr2) );   // لأن المصفوفتين متساويتين في الحجم و الطول true هنا سترجع
	  System.out.println( Arrays.equals(arr1, arr3) );   // لأنهما ليستا متساويتين false هنا سترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	

Java الدالة sort()

تعريفها

ترتب قيم المصفوفة التي نمررها لها مكان الباراميتر a بشكل تصاعدي (ascending).



بناؤها

                  public static void sort(Object[] a)
  


باراميترات

  • مكان الباراميتر a نمرر المصفوفة التي سيتم ترتيبها.



قيمة الإرجاع

لا ترجع قيمة.



أخطاء محتملة

  • ClassCastException: في حال كانت المصفوفة تحتوي عناصر مختلفة في النوع.
    فمثلاً لا يمكنها مقارنة عنصر نوع قيمته int مع عنصر String.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  Object arr1[] = { 4, 1, 3, 5, 2 };
	  Object arr2[] = { 'c', 'b', 'a', 'd', 'e' };

	  Arrays.sort(arr1);   // arr1 هنا قمنا بترتيب قيم المصفوفة
	  Arrays.sort(arr2);   // arr2 هنا قمنا بترتيب قيم المصفوفة

	  // arr1 هنا قمنا بعرض قيم المصفوفة
	  System.out.print("arr1: ");
	  for(Object element: arr1) {
	  System.out.print( element + " ");
	  }

	  System.out.println();

	  // arr2 هنا قمنا بعرض قيم المصفوفة
	  System.out.print("arr2: ");
	  for(Object element: arr2) {
	  System.out.print( element + " ");
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    arr1: 1 2 3 4 5
	  arr2: a b c d e
	

Java الدالة fill()

تعريفها

تستخدم لوضع قيمة أولية في جميع عناصر المصفوفة.
مكان الباراميتر a نمرر المصفوفة التي سيتم وضع قيم أولية لعناصرها. و مكان الباراميتر val نمرر القيمة التي سيتم وضعها لهم.



بناؤها

                  public static void fill(Object[] a, Object val)
  


باراميترات

  • مكان الباراميتر a نمرر المصفوفة التي سيتم إعطائها القيم.

  • مكان الباراميتر val نمرر القيمة التي ستعطى لجميع عناصر المصفوفة.



قيمة الإرجاع

لا ترجع قيمة.



أخطاء محتملة

  • ArrayStoreException: في حال كانت القيمة لا يمكن تخزينها في المصفوفة بسبب اختلاف النوع.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  Object arr1[] = new Object[5];
	  Object arr2[] = { 1, 2, 3, 4, 5};

	  Arrays.fill(arr1, "java");   // java التي كانت موجودة بالقيمة null هنا قمنا بتبديل القيم
	  Arrays.fill(arr2, 100);      // 100 هنا قمنا بتبديل جميع الأرقام التي قمنا بوضعها في المصفوفة بالقيمة

	  // arr1 هنا قمنا بعرض قيم المصفوفة
	  System.out.print("arr1: ");
	  for(Object element: arr1) {
	  System.out.print( element + " ");
	  }

	  System.out.println();

	  // arr2 هنا قمنا بعرض قيم المصفوفة
	  System.out.print("arr2: ");
	  for(Object element: arr2) {
	  System.out.print( element + " ");
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    arr1: java java java java java
	  arr2: 100 100 100 100 100
	

Java الدالة arraycopy()

تعريفها

تستخدم لنسخ محتوى مصفوفة و وضعه في مصفوفة أخرى.

عند إستدعاء هذه الدالة عليك:

  1. تحديد المصفوفة التي تريد نسخ قيم منها, أي الـ source.

  2. تحديد العنصر الذي تريد أن تبدأ عملية النسخ من عنده, أي الـ starting postition in the source.

  3. تحديد المصفوفة التي تريد نسخ القيم فيها, أي الـ destination.

  4. تحديد العنصر الذي تريد أن تبدأ عملية اللصق عنده, أي الـ starting postition in the destination.

  5. تحديد عدد العناصر التي نريد نسخها من المصفوفة الأولى إلى المصفوفة الثانية, أي الـ length.



بناؤها

                  public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
  


باراميترات

  • مكان الباراميتر src نمرر المصفوفة التي سيتم نسخ قيم منها.

  • مكان الباراميتر srcPos نمرر رقم أول index عنصر في المصفوفة src تبدأ عملية النسخ من عنده.

  • مكان الباراميتر dest نمرر المصفوفة التي ستتخزن فيها القيم التي تم نسخها.

  • مكان الباراميتر destPos نمرر رقم index أول عنصر في المصفوفة dest تبدأ عملية النسخ عنده.

  • مكان الباراميتر length نمرر عدد العناصر التي سيتم نسخها من المصفوفة الأولى إلى المصفوفة الثانية.



قيمة الإرجاع

لا ترجع قيمة.



أخطاء محتملة

  • IndexOutOfBoundsException: في حال وضع رقم index خارج عن حجم المصفوفة.

  • ArrayStoreException: في حال كان نوع المصفوفة src لا يمكن تخزينه في المصفوفة dest.

  • NullPointerException: في حال كانت المصفوفة التي نمررها مكان الباراميتر srcأو الباراميتر dest فارغة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  int arr1[] = { 10, 20, 30, 40, 50, 60 };
	  int arr2[] = new int [6];

	  // هنا قمنا بنسخ جميع قيم المصفوفة الأولى و وضعهم في المصفوفة الثانية
	  System.arraycopy(arr1, 0, arr2, 0, 6);

	  // هنا قمنا بعرض جميع قيم عناصر المصفوفة الثانية
	  System.out.print( "arr2 = " );
	  for(int i=0; i<arr2.length; i++)
	  {
	  System.out.print( arr2[i] + ", " );
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    arr2 = 10, 20, 30, 40, 50, 60,
	

مفهوم النصوص

نص: تعني String في جافا, و الـ String عبارة عن مجموعة من الأحرف.
النوع String عبارة عن كلاس و لاحظ أنه يبدأ بحرف كبير مثل إسم أي كلاس في جافا.

إذاً عندما نقوم بتعريف String فنحن فعلياً نقوم بتعريف كائن, و لكننا نقول له متغير لأنه بشكل عام يسمح لنا بتخزين أي قيمة بداخله و لكنه في الأساس كائن نوعه String و ليس متغير عادي.


طريقة تعريف String

أبسط طريقة و الأكثر إستخداماً هي تعريفه مثل متغير عادي.

مثال

String greeting = "Hello world!";
	

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



الكلاس String يحتوي على 13 كونستركتور يمكنك استخدامهم لوضع قيمة أولية في النص من خلال عدة مصادر, مثل من مصفوفة أحرف.

مثال

Main.java
public class Main {

	  public static void main(String[] args) {

	  // هنا قمنا بتعريف مصفوفة من الأحرف
	  char[] helloArray = { 'h', 'e', 'l', 'l', 'o' };

	  // من خلال الكونستركتور helloString هنا وضعنا محتوى مصفوفة الأحرف كنص للكائن
	  String helloString = new String(helloArray);

	  // helloString هنا قمنا بعرض قيمة الكائن
	  System.out.println( helloString );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

hello
	


مفهوم الـ Concatenation

Concatenation تعني إضافة محتوى نص على نص, أي كأنك تنسخ نص و تلصقه في نهاية نص آخر.

يمكنك تطبيق الـ Concatenation في جافا بطريقتين:

  • بإستخدام العامل +.

  • أو بإستدعاء الدالة concat() التي شرحناها لاحقاً في هذا الدرس.


مثال

سنقوم بتعريف نصين و نعطيهم قيم, ثم سنعرف نص ثالث و نضع النصين السابقين فيه.

Main.java
public class Main {

	  public static void main(String[] args) {

	  String s1 = "welcome to ";     // هنا قمنا بتعريف النص الأول
	  String s2 = "harmash.com";     // هنا قمنا بتعريف النص الثاني

	  String s3 = s1 + s2;           // أضفنا قيمة النصين السابقين في النص الثالث
	  System.out.println( s3 );      // هنا عرضنا قيمة النص الثالث لنتأكد إذا تمت عملية الإضافة كما نريد

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

welcome to harmash.com
	

مصطلحات مهمة عليك معرفة معناها

لنفترض أننا قمنا بتعريف String إسمه welcome و أعطيناه قيمة.

مثال

String welcome = "welcome to harmash.com";
	

سيتم تخزين محتوى النص في الذاكرة حرفاً حرفاً و بالترتيب و يبدأ بترقيمهم من الرقم 0 كما في هذه الصورة.


مصطلحات تقنية

  • عدد أحرف الـ String يسمى length.

  • رقم الخانة يسمى index.

  • إذا قمنا بأخذ جزء من الـ String يسمى هذا الجزء substring.


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


مثال

دوال الكلاس String في جافا

الكلاس String هو كلاس جاهز في جافا, يحتوي على دوال كثيرة للتعامل مع محتوى النصوص, سواء للبحث عن أحرف أو كلمات أو جمل, تجزيء النص, تغيير الـ Case للأحرف, دمج النصوص إلخ..


سنقسم دوال الكلاس String إلى 5 فئات أساسية كما في الجدول التالي:

  • دوال للبحث (Searching).

  • دوال للتجزيء (Substring).

  • دوال للتبديل (Replacing).

  • دوال للمقارنة (Comparison).

  • دوال للمعالجة (Manipulation).


ملاحظة

الكلاس String يعتبر Immutable class و هذا يعني أنك عندما تستدعي أي دالة على String, لن تعدل محتوى الـ String الذي قام باستدعائها, بل سترجع لك نسخة معدلة من هذا الـ String و سيبقى الـ String الأصلي كما هو.

دوال البحث الموجودة في الكلاس String

إسم الدالة مع تعريفها
public char charAt(int index) ترجع الحرف الموجود على الـ index الذي نمرره لها مكان الباراميتر index في الـ String الذي قام بإستدعائها.
شاهد المثال »
public int indexOf(String str) تبحث في الـ String الذي قام بإستدعائها عن أول index يوجد إبتداءاَ من عنده نفس النص الذي نمرره لها مكان الباراميتر str و ترجعه.
شاهد المثال »
public int lastIndexOf(String str) تبحث في الـ String الذي قام بإستدعائها عن آخر index يوجد إبتداءاَ من عنده نفس النص الذي نمرره لها مكان الباراميتر str و ترجعه.
شاهد المثال »
public boolean contains(CharSequence cs) ترجع true في حال كان الـ String الذي قام بإستدعائها يحتوي على نفس قيمة النص الذي نمرره لها مكان الباراميتر cs ككائن من الكلاس CharSequence.
غير ذلك ترجع false.
شاهد المثال »

دوال التجزيء الموجودة في الكلاس String

إسم الدالة مع تعريفها
public String substring(int startIndex, int endIndex) ترجع String عبارة عن جزء (substring) من الـ String الذي قام باستدعائها.
شاهد المثال »
public CharSequence subSequence(int startIndex, int endIndex) ترجع كائن من الكلاس CharSequence عبارة عن جزء (substring) من الـ String الذي قام باستدعائها.
شاهد المثال »
public String[] split(String regex) ترجع نسخة من الـ String الذي قام باستدعائها مقسمة على شكل مصفوفة نوعها String.
مكان الباراميتر regex نمرر نص يحدد الطريقة التي سيتم على أساسها تقسيم الـ String و وضع كل قسم فيها في عنصر بداخل المصفوفة.
شاهد المثال »

دوال التبديل الموجودة في الكلاس String

إسم الدالة مع تعريفها
public String replace(char oldSequence, char newSequence) عند استدعائها نمرر لها قيمتين عبارة عن char أو CharSequence.
تبحث في الـ String الذي قام باستدعائها عن القيمة الأولى التي نمررها لها و تبدلها بالقيمة الثانية التي نمررها لها.
شاهد المثال »
public String replaceAll(String regex, String replacement) تستخدم للبحث في الـ String الذي قام باستدعائها عن Substring ما لتبديله بنص جديد.
مكان الباراميتر regex نمرر نص يمثل النص الذي نريد استبداله.
و مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.
إذاً هنا كلما تم إيجاد نفس قيمة الباراميتر regex سيتم إستبدالها بقيمة الباراميتر replacement.
شاهد المثال »
public String replaceFirst(String regex, String replacement) تستخدم لتبديل نص محدد بداخل الـ String الذي قام باستدعائها.
مكان الباراميتر regex نمرر نص يمثل النص الذي نريد استبداله.
و مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.
إذاً هنا عند إيجاد نفس قيمة الباراميتر regex سيتم إستبدالها بقيمة الباراميتر replacement.
شاهد المثال »

دوال المقارنة الموجودة في الكلاس String

إسم الدالة مع تعريفها
public boolean startsWith(String prefix) تستخدم لمعرفة ما إذا كان الـ String الذي قام باستدعائها يبدأ بنص معين أم لا.
إذا كانت قيمة الباراميتر prefix موجودة في بدايته ترجع true, غير ذلك ترجع false.
شاهد المثال »
public boolean endsWith(String suffix) تستخدم لمعرفة ما إذا كان الـ String الذي قام باستدعائها ينتهي بنص معين أم لا.
إذا كانت قيمة الباراميتر prefix موجودة في نهايته ترجع true, غير ذلك ترجع false.
شاهد المثال »
public boolean equals(Object anObject) تقارن قيمة الـ String الذي قام باستدعائها مع قيمة أي كائن نمرره لها مكان الباراميتر anObject.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.
شاهد المثال »
public boolean equalsIgnoreCase(String str) تقارن قيمة الـ String الذي قام باستدعائها مع قيمة الـ String الذي نمرره لها مكان الباراميتر str.
ترجع true في حال كانت جميع أحرفهم متطابقة و لا يهمها إذا كانت الأحرف كبير أو صغيرة, غير ذلك ترجع false.
شاهد المثال »
public boolean contentEquals(StringBuffer sb) تقارن قيمة الـ String الذي قام باستدعائها مع قيمة كائن الـ StringBuffer الذي نمرره لها مكان الباراميتر sb.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.
شاهد المثال »
public int compareTo(String anotherString) تقارن قيمة الـ String الذي قام باستدعائها مع قيمة الـ String الذي نمرره لها مكان الباراميتر anotherString.
ترجع 0 في حال كانت جميع أحرفهم متساوية. و ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.
شاهد المثال »
public int compareToIgnoreCase(String anotherString) تقارن قيمة الـ String الذي قام باستدعائها مع قيمة الـ String الذي نمرره لها مكان الباراميتر anotherString و لا يهمها إذا كانت الأحرف كبير أو صغيرة.
ترجع 0 في حال كانت جميع أحرفهم متساوية. و ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.
شاهد المثال »
public boolean matches(String regex) تقارن قيمة الـ String الذي قام باستدعائها مع التعبير النمطي الذي نمرره لها مكان الباراميتر regex.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.
شاهد المثال »
public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) تقارن جزء محدد في الـ String الذي قام باستدعائها مع جزء محدد في الـ String الذي نمرره لها مكان الباراميتر other.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.
شاهد المثال »

دوال المعالجة الموجودة في الكلاس String

إسم الدالة مع تعريفها
public String concat(String s) ترجع نسخة من الـ String الذي قام باستدعائها مضافاً عليه قيمة الـ String الذي نمرره لها مكان الباراميتر s.
شاهد المثال »
public static String copyValueOf(char[] data) ترجع نسحة من مصفوفة الأحرف التي نمررها لها مكان الباراميتر data كـ String.
شاهد المثال »
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) تنسخ أحرف الـ String الذي قام باستدعائها بداخل مصفوفة الأحرف التي نمررها لها مكان الباراميتر dst مع تحديد النطاق الذي نريد نسخه و المكان الذي نريد وضع الأحرف فيه.
شاهد المثال »
public int hashCode() ترجع قيمة الـ hash code للـ String الذي قام باستدعائها.
شاهد المثال »
public String intern() تمنع وجود أكثر من String يحتوى على نفس المحتوى, لذلك هي مهمة جداً من أجل التخزين. فهي تسرع عمل المعالج و تحفظ مساحات الذاكرة.
شاهد المثال »
public int length() ترجع رقم يمثل عدد أحرف الـ String الذي قام باستدعائها.
شاهد المثال »
public char[] toCharArray() ترجع أحرف الـ String الذي قام باستدعائها كمصفوفة نوعها char.
شاهد المثال »
public String toLowerCase() ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها صغيرة.
شاهد المثال »
public String toUpperCase() ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها كبيرة.
شاهد المثال »
public String trim() ترجع نسخة من الـ String الذي قام باستدعائها لا تحتوي على مسافات فارغة في بدايتها و نهايتها.
شاهد المثال »
public String valueOf(Object anObject) ترجع أي قيمة نمررها لها مكان الباراميتر anObject كـ String.
شاهد المثال »

إرشادات مهمة لمعالجة الأخطاء

في حال وضعت رقم index غير موجود سيظهر لك الخطأ التالي

java.lang.StringIndexOutOfBoundsException: String index out of range

هذا الخطأ يعني أنك طلبت إرجاع قيمة خانة في الـ String غير موجودة, أو أنك حاولت تبديل قيمة خانة في الـ Stringهي في الأساس غير موجودة.
في الحالتين هذا يعني أنك خرجت عن مساحة الـ String المحجوزة في الذاكرة.

إذاً في حال ظهر لك هذا الخطأ إعرف أنك إستخدمت رقم index أكبر من أرقام الـ index الموجودين في الـ String, أو قد يكون رقم أصغر من صفر.


مثال

Main.java
public class Main {

	  public static void main(String[] args) {

	  String s = "java is amazing";
	  System.out.println( s.charAt(30) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 30

هذا يعني أنك طلبت إرجاع قيمة خانة في الـ String غير موجودة, و أظهر لنا أن الخانة رقم 30 تحديداً غير موجودة.

الدالة charAt()

تعريفها

ترجع الحرف الموجود على الـ index الذي نمرره لها مكان الباراميتر index في الـ String الذي قام بإستدعائها.
بمعنى آخر, نعطيها عنوان خانة في النص, فترجع لنا الحرف الموجود في هذه الخانة.



بناؤها

                  public char charAt(int index)
  


باراميترات

  • الـ index هو رقم index الحرف الذي سترجعه الدالة.



قيمة الإرجاع

ترجع الحرف الموجود على الـ index الذي نمرره لها مكان الباراميتر index.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "java is amazing";
	  System.out.println( s.charAt(5) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    i
	

الدالة indexOf()

تعريفها

تبحث في الـ String الذي قام بإستدعائها عن أول index يوجد إبتداءاَ من عنده نفس النص أو الحرف الذي نمرره لها و ترجعه.
بمعنى آخر, نعطيها أي نص أو حرف, فترجع لنا رقم أول خانة وجد عندها.

إفتراضياً هذه الدالة تبدأ عملية البحث من الـ index رقم 0 إلى آخر index موجود في الـ String.
و في حال لم يتم العثور على النص المراد البحث عنه ترجع 1-



بناؤها

هناك أربع أشكال من هذه الدالة. أي يمكن إستدعاءها بأربع طرق مختلفة.

                  // الشكل الأول
	public int indexOf(char ch)

	// الشكل الثاني
	public int indexOf(char ch, int fromIndex)

	// الشكل الثالث
	public int indexOf(String str)

	// الشكل الرابع
	public int indexOf(String str, int fromIndex)
  


باراميترات

  • مكان الباراميتر ch نمرر الحرف الذي ستبحث عنه الدالة.

  • مكان الباراميتر str نمرر الـ String الذي ستبحث عنه الدالة.

  • الباراميتر fromIndex هو باراميتر إختياري, نضع مكانه رقم في حال أردنا جعل الدالة تبدأ عملية البحث من رقم index محدد و ليس من الـ index رقم 0.



قيمة الإرجاع

ترجع رقم يمثل أول index وجد عنده النص أو الحرف الذي مررناه لها, و ترجع 1- في حال لم يتم إيجاد تطابق.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String Str = "welcome to harmash.com, harmash is one of the best site for learning";
	  String subStr = "harmash";

	  System.out.println( Str.indexOf('a') );         // a وجد فيه الحرف index ستطبع أول
	  System.out.println( Str.indexOf('a', 14) );     // رقم 14 index و ستبدأ في البحث من الـ a وجد فيه الحرف index ستطبع أول

	  System.out.println( Str.indexOf(subStr) );      // subStr وجد فيه النص index ستطبع أول
	  System.out.println( Str.indexOf(subStr, 16) );  // رقم 16 index و ستبدأ في البحث من الـ subStr وجد فيه النص index ستطبع أول

	  System.out.println( Str.indexOf('x') );         // ستطبع 1- لأنها لن تجد هذا الحرف في كل النص
	  System.out.println( Str.indexOf('@') );         // ستطبع 1- لأنها لن تجد هذا الحرف في كل النص
	  System.out.println( Str.indexOf("hello") );     // ستطبع 1- لأنها لن تجد هذا النص في كل النص

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    12
	  15
	  11
	  24
	  -1
	  -1
	  -1
	

الدالة lastIndexOf()

تعريفها

تبحث في الـ String الذي قام بإستدعائها عن أول index يوجد إبتداءاَ من عنده نفس النص أو الحرف الذي نمرره لها و ترجعه.
بمعنى آخر, نعطيها أي نص أو حرف, فترجع لنا رقم آخر خانة وجد عندها.

إفتراضياً هذه الدالة تبدأ عملية البحث من الـ index الأخير إلى أول index موجود في الـ String.
و في حال لم يتم العثور على النص أو الحرف المراد البحث عنه ترجع 1-



بناؤها

هناك أربع أشكال من هذه الدالة. أي يمكن إستدعاءها بأربع طرق مختلفة.

                  // الشكل الأول
	public int lastIndexOf(char ch)

	// الشكل الثاني
	public int lastIndexOf(char ch, int toIndex)

	// الشكل الثالث
	public int lastIndexOf(String str)

	// الشكل الرابع
	public int lastIndexOf(String str, int toIndex)
  


باراميترات

  • مكان الباراميتر ch نمرر الحرف الذي ستبحث عنه الدالة.

  • مكان الباراميتر str نمرر الـ String الذي ستبحث عنه الدالة.

  • الباراميتر toIndex هو باراميتر إختياري, نضع مكانه رقم في حال أردنا جعل الدالة توقف عملية البحث عند رقم index محدد و ليس عند آخر index.



قيمة الإرجاع

ترجع رقم يمثل آخر index وجد عنده النص أو الحرف الذي مررناه لها, و ترجع 1- في حال لم يتم إيجاد تطابق.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String Str = "welcome to harmash.com, harmash is one of the best site for learning";
	  String subStr = "harmash";

	  System.out.println( Str.lastIndexOf('a') );         // a وجد فيه الحرف index ستطبع آخر
	  System.out.println( Str.lastIndexOf('a', 14) );     // رقم 14 index قبل الـ a وجد فيه الحرف index ستطبع آخر

	  System.out.println( Str.lastIndexOf(subStr) );      // subStr وجد فيه النص index ستطبع آخر
	  System.out.println( Str.lastIndexOf(subStr, 16) );  // رقم 16 index قبل الـ subStr وجد فيه النص index ستطبع آخر

	  System.out.println( Str.lastIndexOf('x') );         // ستطبع 1- لأنها لن تجد هذا الحرف في كل النص
	  System.out.println( Str.lastIndexOf('@') );         // ستطبع 1- لأنها لن تجد هذا الحرف في كل النص
	  System.out.println( Str.lastIndexOf("hello") );     // ستطبع 1- لأنها لن تجد هذا النص في كل النص

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    62
	  12
	  24
	  11
	  -1
	  -1
	  -1
	

الدالة contains()

تعريفها

ترجع true في حال كان الـ String الذي قام بإستدعائها يحتوي على نفس قيمة النص الذي نمرره لها مكان الباراميتر cs ككائن من الكلاس CharSequence.



بناؤها

                  public boolean contains(CharSequence cs)
  


باراميترات

  • مكان الباراميتر cs نمرر النص الذي سنبحث عنه ككائن من الكلاس CharSequence.



قيمة الإرجاع

ترجع true في حال كان الـ String الذي قام بإستدعائها يحتوي على نفس قيمة كائن الـ CharSequence الذي نمرره لها مكان الباراميتر cs.
غير ذلك ترجع false.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "learn java in harmash.com";
	  CharSequence cs1 = "java";
	  CharSequence cs2 = "c++";

	  System.out.println( s.contains(cs1) );
	  System.out.println( s.contains(cs2) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	

الدالة substring()

تعريفها

ترجع String عبارة عن جزء (substring) من الـ String الذي قام باستدعائها.

عند إستدعاء هذه الدالة عندنا خيارين:

  • تحديد من أين تبدأ.

  • تحديد من أين تبدأ و أين تنتهي.

إذا قمنا فقط بتحديد أين تبدأ الـ substring, سترجع الدالة String تبدأ من الـ index الذي مررناه مكان الباراميتر startIndex لآخر index موجود في الـ String الذي قام باستدعائها.

إذا قمنا بتحديد أين تبدأ و أين تنتهي الـ substring, سترجع الدالة String تبدأ من الـ index الذي مررناه مكان الباراميتر startIndex إلى الـ index الذي مررناه مكان الباراميتر endIndex.

في حال كان رقم الـ index الذي مررناه لها مكان الباراميتر الأول أو الثاني غير موجود, سيظهر لك خطأ.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public String substring(int startIndex)

	// الشكل الثاني
	public String substring(int startIndex, int endIndex)
  


باراميترات

  • الباراميتر startIndex يحدد الـ index الذي ستبدأ الـ substring منه.

  • الباراميتر endIndex يحدد الـ index الذي تنتهي الـ substring عنده.



قيمة الإرجاع

ترجع String عبارة عن substring من الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "welcome to harmash.com, best site for learning";

	  System.out.println( s.substring(11) );       // رقم 11 index تبدأ من الـ substring هنا سترجع الدالة
	  System.out.println( s.substring(11, 22) );   // رقم 22 index رقم 11 و تنتهي قبل الـ index تبدأ من الـ substring هنا سترجع الدالة

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    harmash.com, best site for learning
	  harmash.com
	

الدالة subSequence()

تعريفها

ترجع كائن من الكلاس CharSequence عبارة عن جزء ( substring أو subsequence نفس المعنى ) من الـ String الذي قام باستدعائها.



بناؤها

                  public CharSequence subSequence(int startIndex, int endIndex)
  


باراميترات

  • الباراميتر startIndex يحدد الـ index الذي ستبدأ الـ subsequence منه.

  • الباراميتر endIndex يحدد الـ index الذي تنتهي الـ subsequence عنده.



قيمة الإرجاع

ترجع كائن من الكلاس CharSequence عبارة عن subSequence من الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "welcome to harmash.com, best site for learning";

	  // رقم 22 index رقم 11 و تنتهي قبل الـ index تبدأ من الـ subSequence هنا سترجع الدالة
	  System.out.println( s.subSequence(11, 22) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    harmash.com
	

الدالة split()

تعريفها

ترجع نسخة من الـ String الذي قام باستدعائها مقسمة على شكل مصفوفة نوعها String.
مكان الباراميتر regex نمرر نص يحدد الطريقة التي سيتم على أساسها تقسيم الـ String و وضع كل قسم فيها في عنصر بداخل المصفوفة.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public String[] split(String regex)

	// الشكل الثاني
	public String[] split(String regex, int limit) 
  


باراميترات

  • مكان الباراميتر regex نمرر النص الذي ستستخدمه الدالة لتقسيم الـ String الذي قام باستدعائها.

  • مكان الباراميتر limit نمرر رقم عادي نضعه في حال أردنا تحديد عدد عناصر المصفوفة التي سترجعها الدالة.



قيمة الإرجاع

ترجع مصفوفة نوعها String تحتوي على نص كائن الـ String الذي قام باستدعائها.



المثال الأول

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome-to-harmash.com";

	  // parts بعدها سيتم وضع المصفوفة التي سترجعها في المصفوفة .str ستعتمد على الرمز - حتى تجزء نص الكائن split() هنا الدالة
	  String[] parts = str.split("-");

	  String part1 = parts[0];   // welcome     :الجزء الأول سيحتوي على النص
	  String part2 = parts[1];   // to          :الجزء الثاني سيحتوي على النص
	  String part3 = parts[2];   // harmash.com :الجزء الثالث سيحتوي على النص

	  System.out.println( part1 );
	  System.out.println( part2 );
	  System.out.println( part3 );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome
	  to
	  harmash.com 
	


في البرامج الفعلية لا نستخدم هذا الأسلوب البدائي, بل نستخدم الحلقات للتعامل مع المصفوفات.

المثال الثاني

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome-to-harmash.com";
	  String[] parts = str.split("-");

	  int i = 0;
	  while( i < parts.length ) {
	  System.out.println( parts[i] );
	  i++;
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome
	  to
	  harmash.com 
	


يوجد حلقة متقدمة إسمها foreach loop صممت خصيصاً للتعامل مع الـ arrays, سنشرحها بتفصيل في درس الـ arrays لكننا سنعطيك مثال كفكرة عامة.

المثال الثالث

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome-to-harmash.com";
	  String[] parts = str.split("-");

	  for( String part : parts ) {
	  System.out.println( part );
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome
	  to
	  harmash.com
	


الآن سنتطرق للباراميتر limit, فكرته فقط تحديد إلى كم جزء سيتقسم الـ String.
بمعنى آخر يحدد عدد عناصر المصفوفة التي سترجعها الدالة.

المثال الرابع

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome-to-harmash.com";
	  String[] parts = str.split("-", 2);

	  for( String part : parts ) {
	  System.out.println( part );
	  }

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome
	  to-harmash.com
	

الدالة replace()

تعريفها

عند استدعائها نمرر لها قيمتين عبارة عن char أو CharSequence.
تبحث في الـ String الذي قام باستدعائها عن القيمة الأولى التي نمررها لها و تبدلها بالقيمة الثانية التي نمررها لها.

ملاحظة: الدالة replace() لا تقوم بتعديل نص الـ String الذي يستدعيها, بل ترجع نسخة ثانية معدلة عنه.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public String replace(char oldChar, char newChar)

	// الشكل الثاني
	public String replace(CharSequence oldSequence, CharSequence newSequence) 
  


باراميترات

  • الباراميتر oldChar نمرر مكانه الحرف الذي نريد تبديله.

  • الباراميتر newChar نمرر مكانه الحرف الذي سيحل مكانه.

  • الباراميتر oldSequence نمرر مكانه النص الذي نريد تبديله.

  • الباراميتر newSequence نمرر مكانه النص الذي سيحل مكانه.



قيمة الإرجاع

ترجع الـ String الناتج من عملية التبديل.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome to harmash.com";

	  System.out.println( str.replace('a', 'X') );
	  System.out.println( str.replace(' ', '-') );
	  System.out.println( str.replace("com", "net") );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome to hXrmXsh.com
	  welcome-to-harmash.com
	  welnete to harmash.net
	

الدالة replaceAll()

تعريفها

تستخدم للبحث في الـ String الذي قام باستدعائها عن Substring ما لتبديله بنص جديد.
مكان الباراميتر regex نمرر نص يمثل النص الذي نريد استبداله.
و مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.
إذاً هنا كلما تم إيجاد نفس قيمة الباراميتر regex سيتم إستبدالها بقيمة الباراميتر replacement.

ملاحظة: الدالة replaceAllaode لا تقوم بتعديل نص الـ String الذي يستدعيها, بل ترجع نسخة ثانية معدلة عنه. كما أنها تعتبر متطورة أكثر من الدالة replace() من ناحية القدرة على البحث, لأننا نستطيع تبديل المحتوى على أساس الـ regex.



بناؤها

                  public String replaceAll(String regex, String replacement)
  


باراميترات

  • مكان الباراميتر regex نمرر نص عبارة عن مجموعة رموز يحدد النص الذي نريد تبديله.

  • مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.



قيمة الإرجاع

ترجع الـ String الناتج من عملية التبديل.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "1 mhamad 205 wissam 333 ziad 55 88 hamada";

	  // هنا ستبدل الفراغ بـ - و سنعرض الناتج الذي سترجعه مباشرةً
	  System.out.println( str.replaceAll(" ", "-") );

	  // strWithOutNumbers هنا ستبدل الأرقام بلا شيء, أي ستمسح جميع الأرقام و سترجع الناتج في
	  String strWithOutNumbers = str.replaceAll("[0-9]+", "");
	  System.out.println( strWithOutNumbers );

	  // strOnlyNumbers هنا ستبدل الأحرف بلا شيء, أي ستمسح جميع الأحرف و سترجع الناتج في
	  String strOnlyNumbers = str.replaceAll("[a-zA-Z]+", "");
	  System.out.println( strOnlyNumbers );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    1-mhamad-205-wissam-333-ziad-55-88-hamada
	  mhamad  wissam  ziad   hamada
	  1  205  333  55 88 
	

الدالة replaceFirst()

تعريفها

تستخدم لتبديل نص محدد بداخل الـ String الذي قام باستدعائها.
مكان الباراميتر regex نمرر نص يمثل النص الذي نريد استبداله.
و مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.
إذاً هنا عند إيجاد نفس قيمة الباراميتر regex سيتم إستبدالها بقيمة الباراميتر replacement.

ملاحظة: الدالة replaceFirst() لا تقوم بتعديل نص الـ String الذي يستدعيها, بل ترجع نسخة ثانية معدلة عنه.



بناؤها

                  public String replaceFirst(String regex, String replacement) 
  


باراميترات

  • مكان الباراميتر regex نمرر نص عبارة عن مجموعة رموز يحدد النص الذي نريد تبديله.

  • مكان الباراميتر replacement نمرر النص الذي سيحل مكانه.



قيمة الإرجاع

ترجع الـ String الناتج من عملية التبديل.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "Mhamad harmush 1 2 3";

	  // هنا ستبدل أول فراغ بـ - و ستعرض الناتج الذي سترجعه مباشرةً
	  System.out.println( str.replaceFirst(" ", "-") );

	  // strWithOutNumbers هنا ستبدل أول رقم بلا شيء, أي ستمسح أول رقم فقط و سترجع الناتج في
	  String strWithOutNumbers = str.replaceFirst("[0-9]+", "");
	  System.out.println( strWithOutNumbers );

	  // strOnlyNumbers هنا ستبدل أول كلمة بلا شيء, أي ستمسح أول نص فقط و سترجع الناتج في
	  String strOnlyNumbers = str.replaceFirst("[a-zA-Z]+", "");
	  System.out.println( strOnlyNumbers );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    Mhamad-harmush 1 2 3
	  Mhamad harmush  2 3
	  harmush 1 2 3
	

الدالة startsWith()

تعريفها

تستخدم لمعرفة ما إذا كان الـ String الذي قام باستدعائها يبدأ بنص معين أم لا.
إذا كانت قيمة الباراميتر prefix موجودة في بدايته ترجع true, غير ذلك ترجع false.

عند إستدعاء هذه الدالة عندنا خيارين:

  • عدم تحديد من أين تبدأ, و في هذه الحالة ستبدأ من أول حرف في الـ String الذي قام باستدعائها.

  • تحديد من أين تبدأ.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public boolean startsWith(String prefix)

	// الشكل الثاني
	public boolean startsWith(String prefix, int toffset)
  


باراميترات

  • مكان البارميتر prefix نمرر الـ substring الذي نريد معرفة ما إذا كان موجوداً في بداية الـ String أم لا.

  • مكان البارميتر toffset نمرر الـ index الذي ستبدأ عملية الإختبار من عنده.



قيمة الإرجاع

ترجع true إذا كانت القيمة التي مررناها مكان الباراميتر toffset موجودة في بداية النص, أو في المكان الذي قمنا بتحديد بدأ عملية البحث عنده.
ترجع true أيضاً في حال قمنا باختبار قيمة فارغة.
غير ذلك ترجع false.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome to harmash.com";

	  System.out.println( str.startsWith("welcome to") );   // str لأنها موجودة في بداية النص true سترجع
	  System.out.println( str.startsWith("welc") );         // str لأنها موجودة في بداية النص true سترجع
	  System.out.println( str.startsWith("harmash") );      // str لأنها ليست موجودة في بداية النص false سترجع
	  System.out.println( str.startsWith("harmash", 11) );  // str رقم 11 في النص index لأنها موجودة في بداية الـ true سترجع
	  System.out.println( str.startsWith("") );             // لأننا نختبر قيمة فارغة true سترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  true
	  false
	  true
	  true
	

الدالة endsWith()

تعريفها

تستخدم لمعرفة ما إذا كان الـ String الذي قام باستدعائها ينتهي بنص معين أم لا.
إذا كانت قيمة الباراميتر prefix موجودة في نهايته ترجع true, غير ذلك ترجع false.



بناؤها

                  public boolean endsWith(String suffix)
  


باراميترات

  • مكان الباراميتر suffix نمرر الـ substring الذي نريد معرفة ما إذا كان موجوداً في نهاية الـ String أم لا.



قيمة الإرجاع

ترجع true إذا كانت القيمة التي نختبرها موجودة في نهاية النص.
و ترجع true أيضاً في حال قمنا باختبار قيمة فارغة.
غير ذلك ترجع false.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome to harmash.com";

	  System.out.println( str.endsWith("harmash.com") ); // str لأنها موجودة في نهاية النص true سترجع
	  System.out.println( str.endsWith("harmash") );     // str لأنها ليست موجودة في نهاية النص false سترجع
	  System.out.println( str.endsWith("") );            // لأننا نختبر قيمة فارغة true سترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	  true
	

الدالة equals()

تعريفها

تقارن قيمة الـ String الذي قام باستدعائها مع قيمة أي كائن نمرره لها مكان الباراميتر anObject.
ترجع true في حال كانت جميع أحرفهم متطابقة و لا تساوي الكلمة null, غير ذلك ترجع false.



بناؤها

                  public boolean equals(Object anObject)
  


باراميترات

  • مكان الباراميتر anObject نمرر الكائن الذي نريد مقارنته مع الـ String.



قيمة الإرجاع

  • ترجع true في حال كانت قيمة الكائن الذي نمرره مكان الباراميتر anObject تساوي الـ String الذي قام باستدعائها.

  • ترجع false في حال كانت قيمة الكائن الذي نمرره مكان الباراميتر anObject لا تساوي قيمة الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "hello my name is Mhamad";
	  String s2 = s1;
	  String s3 = "at 20 years old, i made harmash.com";

	  System.out.println( s1.equals(s2) );    // s2 تساوي قيمة s1 لأن قيمة true هنا سترجع
	  System.out.println( s1.equals(s3) );    // s3 لا تساوي قيمة s1 لأن قيمة false هنا سترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	

الدالة equalsIgnoreCase()

تعريفها

تقارن قيمة الـ String الذي قام باستدعائها مع قيمة الـ String الذي نمرره لها مكان الباراميتر str.
ترجع true في حال كانت جميع أحرفهم متطابقة و لا يهمها إذا كانت الأحرف كبير أو صغيرة, غير ذلك ترجع false.



بناؤها

                  public boolean equalsIgnoreCase(String anotherString)
  


باراميترات

  • مكان الباراميتر anotherString نمرر الـ String الذي نريد مقارنته مع الـ String الذي قام باستدعاء الدالة.



قيمة الإرجاع

  • ترجع true في حال كانت قيمة الـ String الذي نمرره مكان الباراميتر anotherString تساوي قيمة الـ String الذي قام باستدعائها.

  • ترجع false في حال كانت قيمة الـ String الذي نمرره مكان الباراميتر anotherString لا تساوي قيمة الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "hello my name is Mhamad";
	  String s2 = "HELLO MY NAME IS MHAMAD";
	  String s3 = s2;

	  // لأنه لا يهمها إذا كان يوجد إختلاف في حجم الأحرف طالما أن الأحرف التي تم مقارنتها هي نفسها true هنا سترجع
	  System.out.println( s1.equalsIgnoreCase(s2) );

	  // s3 تساوي تماماً قيمة s2 لأن قيمة true هنا سترجع
	  System.out.println( s2.equalsIgnoreCase(s3) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  true
	

الدالة contentEquals()

تعريفها

تقارن قيمة الـ String الذي قام باستدعائها مع قيمة كائن الـ StringBuffer الذي نمرره لها مكان الباراميتر sb.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.



بناؤها

                  public boolean contentEquals(StringBuffer sb)
  


باراميترات

  • مكان الباراميتر sb نمرر كائن الـ StringBuffer الذي نريد مقارنته مع الـ String.



قيمة الإرجاع

  • ترجع true في حال كانت قيمة الكائن الذي نمرره مكان الباراميتر sb تساوي قيمة الـ String الذي قام باستدعائها.

  • ترجع false في حال كانت قيمة الكائن الذي نمرره مكان الباراميتر sb لا تساوي قيمة الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "welcome to harmash.com";

	  StringBuffer sb1 = new StringBuffer("welcome to harmash.com");
	  System.out.println( s.contentEquals(sb1) );     // sb1 تساوي قيمة s لأن قيمة true هنا سترجع

	  StringBuffer sb2 = new StringBuffer("welcome to java world");
	  System.out.println( s.contentEquals(sb2) );     // sb2 لا تساوي قيمة s لأن قيمة false هنا سترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	

الدالة compareTo()

تعريفها

تقارن قيمة الـ String الذي قام باستدعائها مع قيمة أي كائن نمرره لها مكان الباراميتر anotherString أو anObject.
ترجع 0 في حال كانت جميع أحرفهم متساوية. و ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public int compareTo(Object anObject)

	// الشكل الثاني
	public int compareTo(String anotherString)
  


باراميترات

  • مكان الباراميتر anObject نمرر الكائن الذي ستتم مقارنته.

  • مكان الباراميتر anotherString نمرر الـ String الذي ستتم مقارنته.



قيمة الإرجاع

  • ترجع 0 في حال كانت جميع أحرفهم متساوية.

  • ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  //  ASCII معلومة: في ترميز الـ
	  //  h = 104     H = 72

	  String s1 = "welcome to harmash.com, one of the best websites for learning";
	  String s2 = "welcome to Harmash.com, amazing website for programmers";
	  String s3 = s1;

	  System.out.println( s1.compareTo(s2) );    // h - H = 104 - 72 = 32
	  System.out.println( s2.compareTo(s1) );    // h - H = 72 - 104 = -32
	  System.out.println( s1.compareTo(s3) );    // هنا سترجع 0 لأنه لا يوجد أي فارق بينهما

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    32
	  -32
	  0 
	

الدالة compareToIgnoreCase()

تعريفها

تقارن قيمة الـ String الذي قام باستدعائها مع قيمة الـ String الذي نمرره لها مكان الباراميتر str و لا يهمها إذا كانت الأحرف كبير أو صغيرة.
ترجع 0 في حال كانت جميع أحرفهم متساوية. و ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.



بناؤها

                  public int compareToIgnoreCase(String anotherString)
  


باراميترات

  • مكان الباراميتر anotherString نمرر الـ String الذي ستتم مقارنته.



قيمة الإرجاع

  • ترجع 0 في حال كانت جميع أحرفهم متساوية.

  • ترجع قيمة أكبر أو أصغر من 0 تمثل الفارق بين كود الـ ASCII الخاص بأول حرف مختلف تم إيجاده بينهما.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  //  ACII معلومة: في ترميز الـ
	  //  A = 65    a = 97    o = 111
	  //  ملاحظة: أثناء مقارنتهم ستعتبر جميع الأحرف أحرف صغيرة
	  //  تساوي 97 Amazing الكبيرة في كلمة A لذلك ستعتبر الـ


	  String s1 = "welcome to harmash.com, one of the best websites for learning";
	  String s2 = "Welcome To Harmash.com, Amazing Website For Programmers";
	  String s3 = s1;

	  System.out.println( s1.compareToIgnoreCase(s2) );    // o - A = o - a = 111 - 97  = 14
	  System.out.println( s2.compareToIgnoreCase(s1) );    // A - o = a - o = 97  - 111 = 14
	  System.out.println( s1.compareToIgnoreCase(s3) );    // هنا سترجع 0 لأنه لا يوجد أي فارق بينهما

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    14
	  -14
	  0 
	

الدالة matches()

تعريفها

تختبر قيمة الـ String الذي قام باستدعائها لمعرفة ما إذا كان يطابق التعبير النمطي الذي نمرره لها مكان الباراميتر regex.
ترجع true في حال كان الـ String الذي قام باستدعائها يطابق التعبير النمطي, غير ذلك ترجع false.



بناؤها

                  public boolean matches(String regex)
  


باراميترات

  • مكان الباراميتر regex نمرر نص عبارة عن مجموعة رموز يحدد النص الذي نريد معرفة ما إذا كان موجوداً في الـ String الذي قام باستدعائها أم لا.



قيمة الإرجاع

  • ترجع true في حال كان الـ String الذي قام باستدعائها يطابق التعبير النمطي.

  • ترجع false في حال كان الـ String الذي قام باستدعائها لا يطابق التعبير النمطي.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome to harmash.com";

	  System.out.println( str.matches("harmash") );           // false ترجع
	  System.out.println( str.matches("welcome(.*)") );       // true ترجع
	  System.out.println( str.matches("(.*)harmash(.*)") );   // true ترجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    false
	  true
	  true
	

أولاً سأل نفسه التالي: هل str يحتوي فقط على النص harmash؟
فكان جواب الشرط false.

ثانياً سأل نفسه التالي: هل str يحتوي على النص welcome و يوجد بعده أي شيء آخر؟
فكان جواب الشرط true.

ثالثاً سأل نفسه التالي: هل str يحتوي على النص harmash و يوجد قبله و بعده أي شيء آخر؟
فكان جواب الشرط true.

الدالة regionMatches()

تعريفها

تقارن جزء محدد في الـ String الذي قام باستدعائها مع جزء محدد في الـ String الذي نمرره لها مكان الباراميتر other.
ترجع true في حال كانت جميع أحرفهم متطابقة, غير ذلك ترجع false.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public boolean regionMatches(int toffset, String other, int ooffset, int len)

	// الشكل الثاني
	public boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) 
  


باراميترات

  • مكان الباراميتر toffset نمرر رقم يحدد نقطة بداية الجزء الموجود في الـ String الذي قام باستدعاء الدالة.

  • مكان الباراميتر other نمرر الـ String الذي سيتم مقارنته مع الـ String الذي قام باستدعاء الدالة.

  • مكان الباراميتر ooffset نمرر رقم يحدد نقطة بداية الجزء other.

  • مكان الباراميتر len نمرر عدد الأحرف التي نريدها أن تتقارن في كلا الجزأين.

  • مكان الباراميتر ignoreCase إذا مررنا مكانه القيمة true, فلن تؤثر الأحرف الكبيرة أو الصغيرة عند المقارنة.



قيمة الإرجاع

  • ترجع true في حال تطابق الجزأين.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "welcome to harmash.com";
	  String s2 = "harmash";
	  String s3 = "HARMASH";

	  System.out.println( s1.regionMatches(11, s2, 0, 7) );
	  System.out.println( s1.regionMatches(11, s3, 0, 7) );
	  System.out.println( s1.regionMatches(true, 11, s3, 0, 7) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    true
	  false
	  true 
	

الدالة concat()

تعريفها

ترجع نسخة من الـ String الذي قام باستدعائها مضافاً عليه قيمة الـ String الذي نمرره لها مكان الباراميتر s.



بناؤها

                  public String concat(String s)
  


باراميترات

  • مكان الباراميتر s نمرر الـ String الذي سيضاف في آخر الـ String الذي قام بإستدعاء الدالة.



قيمة الإرجاع

ترجع String جديد يحتوي على قيمة الـ String الذي قام باستدعاء الدالة و قيمة الـ String الذي نمرره للدالة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "This part is from s1. ";
	  String s2 = "This part is from s2";

	  // s3 بعدها الجواب الذي سيرجع سيتخزن في .s1 في آخر s2 ستضيف الدالة قيمة
	  String s3 = s1.concat( s2 );

	  System.out.println( s3 );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    This part is from s1. This part is from s2
	

Javaالدالة copyValueOf()

تعريفها

ترجع نسحة من مصفوفة الأحرف التي نمررها لها مكان الباراميتر data كـ String.



بناؤها

هناك شكلين من هذه الدالة. أي يمكن إستدعاءها بطريقتين مختلفتين.

                  // الشكل الأول
	public static String copyValueOf(char[] data)

	// الشكل الثاني
	public static String copyValueOf(char[] data, int offset, int count) 
  


باراميترات

  • مكان الباراميتر data نمرر مصفوفة الأحرف التي نريد تحويلها لنص.

  • offset هو باراميتر إختياري يمكنك أن تمرر مكانه رقم الـ index الذي تريد بدأ عملية النسخ من عنده.

  • count هو باراميتر إختياري يمكنك أن تمرر مكانه عدد الأحرف التي نريد نسخها من المصفوفة التي تمررها مكان الباراميتر data.



قيمة الإرجاع

ترجع String تحتوي على أحرف المصفوفة التي نمررها للدالة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  char[] ch = {'I', ' ', 'l', 'o', 'v', 'e', ' ', 'j', 'a', 'v', 'a'};
	  String s = "";

	  s = String.copyValueOf( ch );
	  System.out.println( s );

	  s = String.copyValueOf( ch, 2, 4 );
	  System.out.println( s );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    I love java
	  love
	

الدالة getChars()

تعريفها

تنسخ أحرف الـ String الذي قام باستدعائها بداخل مصفوفة الأحرف التي نمررها لها مكان الباراميتر dst مع تحديد النطاق الذي نريد نسخه و المكان الذي نريد وضع الأحرف فيه.



بناؤها

                  public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
  


باراميترات

  • مكان الباراميتر srcBegin نمرر رقم يمثل index أول حرف في الـ String تبدأ عملية النسخ من عنده.

  • مكان الباراميتر srcEnd نمرر رقم يمثل index الحرف في الـ String الذي تتوقف عملية النسخ عنده.

  • مكان الباراميتر dst نمرر المصفوفة التي ستتخزن فيها النسخة.

  • مكان الباراميتر dstBegin نمرر رقم يمثل index أول حرف في المصفوفة تبدأ عملية اللصق عنده.



قيمة الإرجاع

لا ترجع قيمة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String str = "welcome to harmash.com";
	  char[] arr = new char[10];

	  str.getChars( 0, 10, arr, 0 );

	  System.out.println( "Copied value = " + arr );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    Copied value = welcome to
	

الدالة hashCode()

تعريفها

ترجع قيمة الـ hash code للـ String الذي قام باستدعائها.



الخوارزمية التي يطبقها مترجم لغة جافا لحساب قيمة الـ hash code:

Hash Code = s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1].



بناؤها

                  public int hashCode()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع رقم يمثل قيمة الـ hash code للـ String الذي قام باستدعائها.



مثال

                    public class Main {

	  public static void main(String[] args) {

	  String s = "welcome to harmash.com";

	  System.out.println( "The hascode of s is: " + s.hashCode() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    The hashcode of s is: 1813959918
	

الدالة intern()

تعريفها

تمنع وجود أكثر من String يحتوى على نفس المحتوى, لذلك هي مهمة جداً من أجل التخزين. فهي تسرع عمل المعالج و تحفظ مساحات الذاكرة.
و يمكنك أن تتخيل أنها تجعلك تصل للمحتوى و تتعامل معه دون الإهتمام بأصل نوع المحتوى, سترى ذلك في المثال.



بناؤها

                  public String intern()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع قيمة الـ String كقيمة بسيطة ليس لها نوع محدد.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "welcome to harmash.com";
	  String s2 = new String("welcome to harmash.com");

	  System.out.println( s1 == s2 );           // false لذلك سيرجع s2 ليس مطابقاً لنوع الـ s1 هنا سيعتبر أن نوع الـ
	  System.out.println( s1 == s2.intern() );  // true هنا سيقارن قيمهم فقط دون الإهتمام بنوعهم, لذلك سيرجع

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    false
	  true
	

الدالة length()

تعريفها

ترجع رقم يمثل عدد أحرف الـ String الذي قام باستدعائها.



بناؤها

                  public int length()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع رقم يمثل عدد أحرف الـ String الذي قام باستدعائها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s1 = "welcome to harmash.com";
	  String s2 = new String("java is object oriented programming language");

	  System.out.println( "length of s1 = " + s1.length() );
	  System.out.println( "length of s2 = " + s2.length() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    length of s1 = 22
	  length of s2 = 44
	

الدالة toCharArray()

تعريفها

ترجع أحرف الـ String الذي قام باستدعائها كمصفوفة نوعها char.



بناؤها

                  public char[] toCharArray()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع مصفوفة نوعها char تحتوي على نفس أحرف الـ String و لها نفس حجمه, أي عدد عناصرها يساوي عدد أحرف النص.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "welcome to harmash.com";

	  System.out.println( s.toCharArray() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome to harmash.com
	

الدالة toLowerCase()

تعريفها

ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها صغيرة.



بناؤها

                  public String toLowerCase()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها صغيرة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "Welcome To Harmash.Com";

	  System.out.println( s.toLowerCase() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome to harmash.com
	

الدالة toUpperCase()

تعريفها

ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها كبيرة.



بناؤها

                  public String toUpperCase()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع نسخة من الـ String الذي قام باستدعائها كل أحرفها كبيرة.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "Welcome To Harmash.Com";

	  System.out.println( s.toUpperCase() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    WELCOME TO HARMASH.COM
	

الدالة trim()

تعريفها

ترجع نسخة من الـ String الذي قام باستدعائها لا تحتوي على مسافات فارغة في بدايتها و نهايتها.



بناؤها

                  public String trim()
  


باراميترات

  • لا تقبل أي باراميتر.



قيمة الإرجاع

ترجع نسخة من الـ String الذي قام باستدعائها لا تحتوي على مسافات فارغة في بدايتها و نهايتها.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  String s = "     welcome to harmash.com     ";

	  System.out.println( s.trim() );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    welcome to harmash.com
	

الدالة valueOf()

تعريفها

ترجع أي قيمة نمررها لها عند استدعاءها كـ String.



بناؤها

هناك تسع أشكال من هذه الدالة. أي يمكن إستدعاءها بتسع مختلفتين.

                  // الطريقة الأولى
	public String valueOf(boolean b)

	// الطريقة الثانية
	public String valueOf(char c)

	// الطريقة الثالثة
	public String valueOf(char[] data)

	// الطريقة الرابعة
	public String valueOf(char[] data, int offset, int count)

	// الطريقة الخامسة
	public String valueOf(double d)

	// الطريقة السادسة
	public String valueOf(float f)

	// الطريقة السابعة
	public String valueOf(int i)

	// الطريقة الثامنة
	public String valueOf(long l)

	// الطريقة التاسعة
	public String valueOf(Object obj)
  


باراميترات

  • بشكل عام تقبل أي قيمة شيء نمررها لها.

  • بالنسبة للدالة public String valueOf(char[] data, int offset, int count).

    • مكان الباراميتر data نمرر مصفوفة الأحرف التي نريد تحويلها لنص.

    • offset هو باراميتر إختياري يمكنك أن تمرر مكانه رقم الـ index الذي تريد بدأ عملية النسخ من عنده.

    • count هو باراميتر إختياري يمكنك أن تمرر مكانه عدد الأحرف التي نريد نسخها من المصفوفة التي تمررها مكان الباراميتر data.



قيمة الإرجاع

ترجع أي قيمة نمررها لها عند استدعاءها كـ String.



مثال

Main.java
                    public class Main {

	  public static void main(String[] args) {

	  int i = 10;
	  double d = 55.99;
	  long l = 123456;
	  boolean b = true;
	  char[] arr = {'j', 'a', 'v', 'a'};

	  System.out.println( "Return Value: " + String.valueOf(i) );
	  System.out.println( "Return Value: " + String.valueOf(d) );
	  System.out.println( "Return Value: " + String.valueOf(l) );
	  System.out.println( "Return Value: " + String.valueOf(b) );
	  System.out.println( "Return Value: " + String.valueOf(arr) );

	  }

	  }
	

سنحصل على النتيجة التالية عند التشغيل.

                    Return Value: 10
	  Return Value: 55.99
	  Return Value: 123456
	  Return Value: true
	  Return Value: java