اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

يمكنك استخدام equals بدلا من == كالتالي

     public static void main(String []args){
        String string1 = new String("hello");
        String string2 = new String("hello");
        System.out.println(string1.equals(string2));
     }

لنفترض لدينا المتغيرين string1 , string2 , سوف نقارن المتغير الأول مع المتغير الثاني باستخدام equals, اذا كان النصين متشابهين تماما حتى في شكل الحروف صغيرة أو كبيرة فسوف تقوم بارجاع true , ما دون ذلك سوف ترجع false, في المثال المرفق في الأعلى سوف تكون النتيجة true, ولكن ماذا لو غيرنا الحرف الاول من كلمة hello في المتغير الأول كالتالي

     public static void main(String []args){
        String string1 = new String("Hello");
        String string2 = new String("hello");
        System.out.println(string1.equals(string2));
     }

لاحظ يوجد اختلاف في شكل الحروف واذا استخدمنا equals سوف تقوم بارجاع false أي أنهما ليس متساويين, اذا أردتي اهمال حالة الاحرف يمكنك استخدام equalsIgnoreCase كالتالي

     public static void main(String []args){
        String string1 = new String("Hello");
        String string2 = new String("hello");
        System.out.println(string1.equalsIgnoreCase(string2));
     }
}

سوف تهمل حالة الأحرف وترجع true

  • 0
نشر

لتوضيح سبب عدم عمل == للمقارنة بين السلسل، حيث أن هذا التحقق == يقوم على التأكد من أن طرفي المساواة يتبعان لموقع ذاكرة واحد، يحدث ذلك لأن السلسل النصية في جافا String عبارة عن أغراض Objects وعند استخدام المقارنة بين الأغراض == نتأكد من أن أحد هذين الغرضين يشير reference للغرض الآخر وتعديل أحدهما يؤدي لتعديل الغرض الآخر ..

أما في حال مقارنة متغيرات بأنماط بيانات البسيطة primitive data types مثل int - float - double فتعمل المقارنة == للتأكد من تطابق القيمة وهنا تكون صحيحة. 

مثال فيه == تعمل مثل equals :

Object ob1 = new Object();
Object ob2 = ob1;

System.out.println(ob1 == ob2);      // مطابقة true
System.out.println(ob1.equals(ob2)); // مطابقة true

لاحظ إسناد الغرض الأول للفرض الآخر هنا سيكون كلاهما له نفس الموقع في الذاكرة و نفس القيمة 

Nbha6.png.cac3bd84a2daef410054cffb95aa5f68.png

********

أما في حال إنشاء غرضين مختلفين 

String ob1 = new String("Hi");
String ob2 = new String("Hi");

System.out.println(ob1 == ob2);       // false لدينا غرضين مختلفين
System.out.println(ob1.equals(ob2));  // true

هنا == تعطي عدم تطابق لأن لدينا غرضين مختلفين

HPVXk.png.7e9830c090020120e241676390fb1450.png

************

حالة خاصة في عملية مقارنة السلسل:: 

String ob1 = "Hi";
String ob2 = "Hi";  // نفس الغرض

System.out.println(ob1 == ob2);      // مطابقة true
System.out.println(ob1.equals(ob2)); // مطابقة true

عند كتابة "Hi" هذا عبارة عن غرض له hashCode  ثابت، سيكون للمتغيرين نفس العنوان في الذاكرة.. (حالة خاصة)

هنا بما أن السلسة النصية ثابتة، يتم عمل مثل ربط بين هذه السلاسل لكي لا تأخذ ذاكرة بيتم إعطاؤوها نفس العنوان

wIglp.png.ea3f2bcf02ad8712389fc64ec806e798.png

****

الحل هو استخدام equals مثل التعليق الآخر إجابة المدرب محمد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...