• 0

مقارنة النصوص في جافا

يمكن المقارنه بين بيانات من نوع String

String x,y;

if(x=="y");

S.O.P(10);

هذه الطريقه خاطئه مامن طريقه اخرى

2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 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 مثل التعليق الآخر إجابة المدرب محمد

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن