تعتبر مقارنة الكائنات من أجل التكافؤ واحدة من أهم عمليات البرمجة. ومع ذلك، على الرغم من وضوحه في العالم الرقمي، ليس من الواضح دائمًا كيفية مقارنة أنواع البيانات الأخرى. تحدد فئة Java Object ، وهي فئة أساسية، طريقتي يساوي () ومقارنة () للمقارنة. تتجاوز فئة السلسلة طريقة يساوي () الخاصة بها. تقوم طريقة Java String يساوي () بمقارنة سلسلتين وفقًا لمحتوياتهما. يبدو توقيع أسلوب السلسلة يساوي () كما يلي:
public boolean equals(Object anotherObject)
تقارن طريقة Stringequals () السلسلة بالكائن المحدد. إذا كانت السلاسل متساوية، فإنها ترجع صحيحا، وإلا فإنها كاذبة. قد تتساءل لماذا لا تقارن السلاسل باستخدام عامل المقارنة == ؟ في الواقع، هذا ممكن أيضًا، لكن النتيجة ستكون مختلفة بعض الشيء. الحقيقة هي أن عامل التشغيل == يقارن العناوين في الذاكرة. لذا، إذا أعادت s1 == s2 القيمة true ، فإن هاتين السلسلتين لهما نفس العنوان في الذاكرة. وفي الوقت نفسه، يقوم يساوي بالتحقق من محتويات السلاسل للتأكد من تساويها. لنأخذ مثالاً لمقارنة سلسلتين.
public class StringEqualsTest {
//program to test Java equals() method
public static void main(String[] args) {
String myString1 = "here is my favorite string";
String myString2 = "here is my favorite string"; //this string is the same as the previous one, at least we think so
String myString3 = "here is My favorite string"; //this string looks a little bit like previous two, but the first letter is big M instead of small m
String myString4 = new String("here is my favorite string");
//here we create a String in an object manner… Why? Find out soon
String myString5 = "equals to myString1? No, not at all..."; //here we have absolutely different string. Just for fun
//let’s compare myString1 with myString2 using “==” operator
System.out.println(myString1 == myString2); //true
//let’s compare myString1 with myString4 using “==” operator
System.out.println(myString1 == myString4); //false
//and now we are going to use equals() method to compare myString1 with myString4, myString2 and myString5
System.out.println(myString1.equals(myString4));//true
System.out.println(myString1.equals(myString2));//true
System.out.println(myString1.equals(myString5)); //false
}
}
مخرجات هذا البرنامج هي :
صحيح خطأ صحيح صحيح خطأ
دعونا نلقي نظرة فاحصة على ما يحدث هنا. عندما نقوم بإنشاء سلسلة، يتم وضعها في تجمع السلاسل، وهي منطقة خاصة من الذاكرة. تشغل السلاسل جزءًا كبيرًا من كافة الكائنات الموجودة في أي برنامج كبير. لذلك، لتوفير الذاكرة، تم إنشاء String Pool، حيث يتم وضع سلسلة تحتوي على النص الذي تحتاجه. تشير الارتباطات التي تم إنشاؤها حديثًا لاحقًا إلى نفس منطقة الذاكرة، وليست هناك حاجة لتخصيص ذاكرة إضافية في كل مرة. إذا قمت بإنشاء سلسلة بدون عامل تشغيل جديد، أي عند الكتابة
String myStringName = "...........................................",
أو شيء من هذا القبيل، يتحقق البرنامج مما إذا كانت هناك سلسلة تحتوي على هذا النص في تجمع السلسلة. إذا كان الأمر كذلك، فلن يتم إنشاء سلسلة جديدة. وسيشير الارتباط الجديد إلى نفس العنوان في String Pool حيث تم تخزين هذه السلسلة بالفعل. لذلك عندما كتبنا في البرنامج
String myString1 = "here is my favorite string";
String myString2 = "here is my favorite string";
يشير المرجع myString1 إلى نفس المكان تمامًا في الذاكرة مثل myString2 . أنشأ الأمر الأول سلسلة جديدة في String Pool بالنص الذي نحتاجه، وعندما يتعلق الأمر بالأمر الثاني، فقد أشار ببساطة إلى نفس منطقة الذاكرة مثل myString1 . ولكن تم إنشاء السلسلة myString4 ككائن باستخدام عامل تشغيل جديد . يقوم هذا العامل بتخصيص منطقة جديدة في الذاكرة لكائن ما عند إنشائه. سلسلة تم إنشاؤها باستخدام new
String myString1 = new String ("here is my favorite string");
String myString2 = new String ("here is my favorite string");
لا يقع في مجموعة السلاسل، ولكنه يصبح كائنًا منفصلاً، حتى لو كان نصه يتطابق تمامًا مع نفس السلسلة من مجموعة السلاسل. علاوة على ذلك، إذا قارنا السلاسل باستخدام طريقة Stringequals () ، فلن يتم التحقق من العنوان، ولكن محتويات السلسلة، وتسلسل الأحرف في السلاسل. وإذا كان النص الموجود في السلاسل هو نفسه، فلا يهم كيفية إنشائها ومكان تخزينها، في تجمع السلاسل، أو في منطقة ذاكرة منفصلة. لهذا السبب كانت myString1 و myString2 و myString4 متساوية في هذه المقارنة. بالمناسبة، هل لاحظت أن طريقة Stringequals () تسمح لك بمقارنة السلاسل بشكل صحيح بطريقة حساسة لحالة الأحرف؟ أي أننا إذا قارنا السلسلة "سلسلتي" بالسلسلتين "سلسلتي" و"سلسلتي" فسنحصل على خطأ.
public class StringEqualsTest {
public static void main(String[] args) {
String myString1 = new String ("here is my favorite string");
String myString2 = new String ("here is My favorite string");
String myString3 = new String("HERE IS MY FAVORITE STRING");
System.out.println(myString1.equals(myString2)); //false because first string myString1 has small m and myString2 has big M instead
System.out.println(myString1.equals(myString3));//false because myString1 is in lowercase while myString3 is in uppercase
}
}
الإخراج هنا:
كاذبة كاذبة
لمقارنة السلاسل بطريقة غير حساسة لحالة الأحرف، لدى Java طريقة مشابهة جدًا لـ يساوي :
boolean equalsIgnoreCase(String anotherString)
دعونا نستخدمها في مثالنا.
public class StringEqualsTest {
public static void main(String[] args) {
String myString1 = new String ("here is my favorite string");
String myString2 = new String ("here is My favorite string");
String myString3 = new String("HERE IS MY FAVORITE STRING");
/* here we are going to use the brother of equals() method, equalsIgnoreCase(). It can help to check user input when case isn’t
important */
System.out.println(myString1.equalsIgnoreCase(myString2));
System.out.println(myString1.equalsIgnoreCase(myString3));
}
}
الآن الإخراج هو:
حقيقي حقيقي
المزيد من القراءة: |
---|
GO TO FULL VERSION