على الرغم من أن السؤال حول سلاسل Java "==" و"يساوي" هو السؤال الأساسي في تعلم Java، إلا أنه لا يزال هناك العديد من الطلاب الذين تعلموا Java للتو وليس لديهم فكرة واضحة عن المبادئ، وقد ناقشت هذه المشكلة مؤخرًا مع أصدقائي. ، لذلك كتبت مقالاً لأشارككم فهمي الخاص.
أولا دعونا نلقي نظرة على مثال:
انسخ رمز الكود كما يلي:
الطبقة العامة TestStringEquals {
public static void main(String[] args) {
سلسلة أ = "اختبار"؛
السلسلة ب = "اختبار"؛
سلسلة ج = سلسلة جديدة ("اختبار")؛
سلسلة د = سلسلة جديدة("اختبار");
سلسلة ه = أ؛
سلسلة و = سلسلة جديدة (أ)؛
سلسلة ز = أ + ""؛
System.out.println(a == b ? "التعبير /"a==b/" صحيح"
: "التعبير /"a==b/" غير صحيح");
System.out.println(a == c ? "التعبير /"a==c/" صحيح"
: "التعبير /"a==c/" غير صحيح");
System.out.println(c == d ? "التعبير /"c==d/" صحيح"
: "التعبير /"c==d/" غير صحيح");
System.out.println(a == e ? "التعبير /"a==e/" صحيح"
: "التعبير /"a==e/" غير صحيح");
System.out.println(a == f ? "التعبير /"a==f/" صحيح"
: "التعبير /"a==f/" غير صحيح");
System.out.println(a == g ? "التعبير /"a==g/" صحيح"
: "التعبير /"a==g/" غير صحيح");
إذا (أ.يساوي(ب) && ب.يساوي(ج) && ج.يساوي(د) && د.يساوي(ه)
&& e.equals(f) && f.equals(g)) {
System.out
.println("a يساوي b يساوي c يساوي d يساوي e يساوي f يساوي g");
}
}
}
إذا لم تكن لديك الإجابة حتى الآن، فلنحاول القيام بذلك. هل يمكنك ضمان أن كل شيء صحيح؟
الجواب معلن أدناه:
انسخ رمز الكود كما يلي:
التعبير "أ==ب" صحيح
التعبير "a==c" غير صحيح
التعبير "c==d" غير صحيح
التعبير "a==e" صحيح
التعبير "a==f" غير صحيح
التعبير "a==g" غير صحيح
<div style="text-align: left;"></div>أ يساوي ب يساوي ج يساوي د يساوي e يساوي f يساوي g
لفهم هذا النوع من المشاكل جيدًا، فإن أفضل طريقة هي أن يكون لديك فهم عميق لآلية ومبادئ طريقة "==" وطريقة "يساوي" للسلسلة في Java. يجب أن يعلم الجميع أن "يساوي" هو مقارنة محتويات السلاسل، نظرًا لأن جميع محتويات السلسلة في البرنامج أعلاه هي "اختبار"، فستكون جميعها متساوية عند مقارنتها بالمساواة.
ولكن هل تعلم أن طريقة التساوي وطريقة "==" لكائن الفئة الأساسية في Java هما في الواقع نفس الشيء؟ إنه فقط بعد أن ترث فئة String فئة الكائن (جميع الفئات في Java ترث فئة الكائن)، فإنها تفرط في تحميل الطريقة المتساوية، مما يجعلها مقارنة لمحتويات السلسلة.
بعد أن أصبح لدينا فهم جيد للمساواة، دعونا الآن ندرس تعقيدات طريقة "==".
"==" هو عامل تشغيل في Java. والمحتوى الذي يقارنه هو مؤشرات لكائنين، وهو عنوان الكائن الفعلي. لذلك فمن السهل أن نفهم أن e==a تُرجع صحيحًا.
دعونا نلقي نظرة على المقارنة بين c وd مرة أخرى. عندما نرى الكلمة الأساسية الجديدة، فهذا يعني أن كلاً من c وd قد أعيد تطبيقهما على عنوان الذاكرة، ثم تم تعيين القيمة "اختبار"، لذلك تُرجع c==d خطأ. إنه أمر مفهوم بنفس الطريقة
تُرجع جميع العمليات "==" بين a وc وd وf خطأ.
ثم دعونا نلقي نظرة على g= a + "". على الرغم من أننا لا نرى الكلمة الأساسية الجديدة، نظرًا لأن عامل تشغيل فئة السلسلة "+" محمّل بشكل زائد، فمن المؤكد أنه سيتم إضافة سلسلة جديدة في الطريقة المحملة بشكل زائد، لذلك أصبح ما سبق. الموقف. ثم أصعب شيء هو فهم المقارنة بين a و b. في الواقع، هذا نتيجة لتحسين مترجم Java. يحتوي مترجم Java على منطقة تخزين تسمى تجمع السلسلة الثابتة. بعد تجميع العبارة، سيتم تخزين "الاختبار" في مجموعة السلسلة الثابتة هذه. ثم عندما يتم تعريف b مرة أخرى، لا يزال b يشير إلى هذه المنطقة، لذلك لا يزال a وb يشيران إلى نفس المنطقة. إذن a==b يُرجع صحيحًا.