سؤال

عندما أستخدم طريقة يساوي () مع كائنين مختلفين من سلسلة StringBuffer، أحصل على النتيجة على أنها خطأ، ولكن عندما أستخدم طريقة يساوي () مع كائنين من سلسلة مختلفة، أحصل على النتيجة على أنها صحيحة.لماذا؟

    String s=new String("434");
    String s1=new String("434");

    System.out.println(s.equals(s1));//true

   StringBuffer s=new StringBuffer("434");
   StringBuffer s1=new StringBuffer("434");

   System.out.println(s.equals(s1));//false
هل كانت مفيدة؟

المحلول

وStringBuffer لا تجاوز يساوي (). على هذا النحو، Object.equals () يسمى، التي تقارن هوية الكائن (عنوان الذاكرة). سلسلة لا تجاوز متساوين ومقارنة المحتوى.

نصائح أخرى

وStringBuffer لا يتجاوز Object#equals()، لذلك كنت تعاني <م> هوية المرجعية القائم على الشيكات بدلا من <م> قيمة القائم على الشيكات. ولما كانت هذه الحالات StringBuilder تختلف، ولكل منها مواقع الذاكرة المختلفة، فإن تنفيذ قاعدة Object#equals() يعود دائما كاذبة.

وفيما يلي تعريف اعتبارا من جاوة 6:

public boolean equals(Object obj) {
  return (this == obj);
}

وانظر المشكلة؟

وعلى الأقل في نسختي من JDK (الأحد 1.6)، StringBuffer لا تنفيذ طريقة () على قدم المساواة. وهذا يعني أنه يرث متساوين كائن في طريقة ()، والذي هو نفس ==

إذا كنت تريد حقا لاختبار اثنين StringBuffers من أجل المساواة، يمكن استدعاء x.toString (). يساوي (y.toString ())

إذا ما كنت تبحث القيام به هو مقارنة تمثيل سلسلة من اثنين من الكائنات StringBuffer، ثم ما تريد القيام به هو:

StringBuffer sb1 = new StringBuffer("434");
StringBuffer sb2 = new StringBuffer("434");
if (sb1.toString().equals(sb2.toString())) {
  // whatever you want to do if they're equal
} else {
  // whatever you want to do if they're not
}

وعلى خلاف ذلك، كنت مقارنة على المساواة بين StringBuffer اثنين <م> التحف ، وليس محتوياتها - وبعبارة أخرى، تنفيذ كائن # يساوي ()، وليس (غير موجودة) StringBuffer # متساوين ().

ويساوي فقط يعود الصحيح على الأشياء StringBuffer عند الكائنين هي نفسها. لمقارنة StringBuffers بالطريقة التي تريدها، استخدم هذا:

System.out.println(s.toString().equals(s1.toString());
سوف

وs.equals سلسلة استخدام الجدول سلسلة مقارنة السلاسل الفعلية حيث وسوف sb.equals StringBuffer مجرد استخدام تطبيق الافتراضي طريقة متساوين وفقط مقارنة مؤشرات الكائن.

ليس لدى StringBuffer تطبيق خاص به لطريقة يساوي، فهو يرث طريقة يساوي () من فئة الكائن ومن ثم تتم مقارنة قيم التجزئة بدلاً من مقارنة المحتوى الفعلي في stringBuffer.ومن ثم يتعين علينا إرسالها بشكل صريح إلى كائن سلسلة يوفر تنفيذ طريقة يساوي ().

ودلالات الكائن String هي تلك التي إذا لوحظ حالتين من أي وقت مضى إلى تحتوي على نفس تسلسل الأحرف، فإنها سوف تحتوي دائما على نفس تسلسل الأحرف ويمكن للمرء - على الأقل من وجهة نظر من وجوه String نفسها --replace كل ما يشير إلى واحدة من السلاسل مع إشارات إلى أخرى دون تغيير دلالات البرنامج. ويمكن اعتبار مثل هذه الحالات يعادل، لأنه بالنسبة لجميع الأغراض العملية، فإن المعلومات الوحيدة مغلفة في مثيل String هو تسلسل الأحرف الواردة في المقام الهدف.

وعلى النقيض من ذلك، متغير من نوع StringBuffer بتغليف يست مجرد سلسلة من الأحرف، ولكن أيضا <م> هوية من خاص المثال. إذا تشير اثنين من المتغيرات إلى نفس المثال، تغيير إلى المثال الذي أشار إليه متغير واحد سيؤثر على سبيل المثال المشار إليها من قبل الطرف الآخر (لأنه نفس المثال). إذا كانت تشير إلى حالات مختلفة، تغييرات على سبيل المثال المشار إليها من جانب واحد لن يؤثر على سبيل المثال المشار إليها من قبل الطرف الآخر. القرار ليس لديهم كان StringBuffer equals تجاوز جاوة يست نتيجة الكسل، ولكن استند بدلا على حقيقة أن الأجسام StringBuffer لها هوية ذات مغزى، والحالات المنفصلة دائما هويات مختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top