سؤال

هذا السؤال سبق الجواب هنا:

لقد تحولت المحاضرين اليوم وذكر باستخدام التعليمات البرمجية غريبة بالنسبة لي.(قال إنه من الأفضل استخدام .equals وعندما سألت عن السبب فأجاب: "لأنه هو!")

لذا هنا مثال:

if (o1.equals(o2))
{
 System.out.println("Both integer objects are the same");
}

بدلا من ما أنا معتاد على:

if (o1 == o2)
{
  System.out.println("Both integer objects are the same");
}

ما هو الفرق بين الاثنين.و لماذا طريقه (باستخدام .equals) أفضل ؟

وجدت هذا في بحث سريع ولكن أنا لا يمكن أن تجعل حقا معنى هذا الجواب:

هل كانت مفيدة؟

المحلول

في جافا، == دائمًا ما يقارن بين مرجعين (بالنسبة لغير البدائيين) - على سبيل المثال.فهو يختبر ما إذا كان المعاملان يشيران إلى نفس الكائن.

ومع ذلك، equals يمكن تجاوز الطريقة - لذلك لا يزال من الممكن بقاء كائنين مختلفين متساويين.

على سبيل المثال:

String x = "hello";
String y = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

System.out.println(x == y); // false
System.out.println(x.equals(y)); // true

بالإضافة إلى ذلك، يجدر بنا أن ندرك أن أي اثنين متساويان ثوابت السلسلة (في المقام الأول سلسلة حرفية، ولكن أيضًا مجموعات من ثوابت السلسلة عبر التسلسل) ستشير في النهاية إلى نفس السلسلة.على سبيل المثال:

String x = "hello";
String y = "he" + "llo";
System.out.println(x == y); // true!

هنا x و y هي إشارات إلى نفس السلسلة، لأن y هو ثابت وقت الترجمة يساوي "hello".

نصائح أخرى

يقارن عامل التشغيل == ما إذا كانت الكائنات متماثلة مثال.يقارن مشغل يساوي () بين حالة الكائنات (على سبيل المثالإذا كانت جميع الصفات متساوية).يمكنك أيضًا تجاوز طريقة يساوي () لتعريف نفسك عندما يكون كائن مساويًا لكائن آخر.

إذا دخلنا أنا وأنت إلى البنك، وفتح كل منا حسابًا جديدًا، وأودع كل واحد 100 دولار، إذن...

  1. myAccount.equals(yourAccount) يكون true لأن لديهم نفس القيمة, ، لكن
  2. myAccount == yourAccount يكون false لأنهم ليسوا نفس الحساب.

(بافتراض التعريفات المناسبة لل Account الطبقة، بطبيعة الحال.؛-)

== عامل تشغيل.يساوي هي طريقة محددة في فئة الكائن

== يتحقق مما إذا كان هناك كائنان لهما نفس العنوان في الذاكرة وبالنسبة للكائنات البدائية، فإنه يتحقق مما إذا كان لهما نفس القيمة. ومن ناحية أخرى، تتحقق الطريقة من ما إذا كان الكائنان اللذان تتم مقارنتهما لهما قيمة متساوية (اعتمادًا على كيفية عمل ذلك بالطبع) تم تنفيذ طريقة يساوي للكائنات.لا يمكن تطبيق طريقة متساوية على البدائية (مما يعني أنه إذا كان A A.Equals بدائي (SomeObject) غير مسموح به ، ولكن يُسمح بـ SomeObject.equals (A)).

== يقوم عامل التشغيل بمقارنة مرجعين للكائنات للتحقق مما إذا كانا يشيران إلى نفس المثيل.وهذا أيضًا سيعود صحيحًا في حالة التطابق الناجح. على سبيل المثال

public class Example{
public static void main(String[] args){
String s1 = "Java";
String s2 = "Java";
String s3 = new string ("Java");
test(Sl == s2)     //true
test(s1 == s3)      //false
}}

المثال أعلاه == عبارة عن مقارنة مرجعية، أييشير كلا الكائنين إلى نفس موقع الذاكرة

يتم تقييم السلسلة يساوي () لمقارنة القيم في الكائنات.

   public class EqualsExample1{
   public static void main(String args[]){
   String s = "Hell";
   String s1 =new string( "Hello");
   String s2 =new string( "Hello");
   s1.equals(s2);    //true
    s.equals(s1) ;   //false
    }}

المثال أعلاه يقارن محتوى السلاسل.سيُرجع صحيحًا إذا تطابقت السلسلة، وإلا يُرجع خطأ.

في جافا، عندما “==” يتم استخدام عامل التشغيل لمقارنة كائنين، فهو يتحقق لمعرفة ما إذا كانت الكائنات تشير إلى نفس المكان في الذاكرة.السابق:

String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1 == obj2)
   System.out.println("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

على الرغم من أن السلاسل تحتوي على نفس الأحرف بالضبط ("xyz")، فإن الكود أعلاه سيُخرج فعليًا:obj1==obj2 خطأ

تتجاوز فئة Java String بالفعل الإعداد الافتراضي يساوي () التنفيذ في فئة الكائن - وهو يتجاوز الطريقة بحيث يتحقق فقط من قيم السلاسل، وليس مواقعها في الذاكرة.هذا يعني أنه إذا قمت باستدعاء طريقة يساوي () لمقارنة كائنين من السلسلة، فطالما أن التسلسل الفعلي للأحرف متساوٍ، فسيتم اعتبار كلا الكائنين متساويين.

String obj1 = new String("xyz");
String obj2 = new String("xyz");
if(obj1.equals(obj2))
   System.out.printlln("obj1==obj2 is TRUE");
else
  System.out.println("obj1==obj2 is FALSE");

سيخرج هذا الكود ما يلي:

obj1==obj2 صحيح

public static void main(String[] args){
        String s1 = new String("hello");
        String s2 = new String("hello");

        System.out.println(s1.equals(s2));
        ////
        System.out.println(s1 == s2);

    System.out.println("-----------------------------");

        String s3 = "hello";
        String s4 = "hello";

        System.out.println(s3.equals(s4));
        ////
        System.out.println(s3 == s4);
    }

هنا في هذا الكود يمكنك تغيير كلا من '==' و'.equals'

هنا يتم استخدام .equals لمقارنة الكائنات المرجعية ويتم استخدام "==" لمقارنة حالة الكائنات.

(1) يمكن تطبيق == على كل من العناصر الأولية وأنواع الكائنات، ولكن يمكن تطبيق طريقة يساوي () على أنواع الكائنات فقط.

(2) لا يمكن تجاوز == لمقارنة المحتوى، ولكن يمكن تجاوز طريقة يساوي لمقارنة المحتوى (على سبيل المثال؛فئة السلسلة، فئات المجمع، فئات المجموعة).

(3) == يعطي خطأ في الأنواع غير المتجانسة عند محاولة التقديم على الأنواع غير المتجانسة، حيث تُرجع طريقة يساوي خطأ.

على equals( ) طريقة == المشغل إجراء عمليتين مختلفتين.على equals( ) طريقة يقارن الشخصيات داخل String الكائن.على == مشغل يقارن بين اثنين من وجوه المراجع لمعرفة ما إذا كانت تشير إلى نفس الدرجة.البرنامج التالي يوضح كيفية مختلفين سلسلة الكائنات يمكن أن تحتوي على نفس الشخصيات لكن الإشارات إلى هذه الأشياء لن مقارنة قدم المساواة:

// equals() vs ==
class EqualsNotEqualTo {
     public static void main(String args[]) {
          String s1 = "Hello";
          String s2 = new String(s1);
          System.out.println(s1 + " equals " + s2 + " -> " +
          s1.equals(s2));
          System.out.println(s1 + " == " + s2 + " -> " + (s1 == s2));
     }
}

المتغير s1 يشير إلى سلسلة سبيل المثال تم إنشاؤها من قبل “Hello”.الكائن المشار إليه من قبل s2 يتم إنشاؤه مع s1 كما مهيئ.وهكذا ، فإن محتويات اثنين من سلسلة الكائنات متطابقة ، لكنها متميزة الكائنات.وهذا يعني أن s1 و s2 لا تشير إلى نفس الأشياء ، ولذلك لا ==, كما هو موضح هنا من خلال إخراج المثال السابق:

Hello equals Hello -> true
Hello == Hello -> false

لنفترض أن عامل التشغيل "==" يُرجع صحيحًا إذا كان كلا المعاملين ينتميان إلى نفس الكائن ولكن عندما يعود صحيحًا لأننا لا نستطيع تعيين قيم متعددة لكائن واحد

public static void main(String [] args){
    String s1 = "Hello";
    String s1 = "Hello";  // This is not possible to assign multiple values to single object
    if(s1 == s1){
      // Now this retruns true
   }
}

الآن عندما يحدث هذا من الناحية العملية، إذا لم يحدث ذلك، فلماذا == يقارن الوظائف....

إليك تفسير بسيط لمشكلتك:

== (يساوي) يستخدم لتقييم التعبير الحسابي

بينما

يساوي () الطريقة المستخدمة لمقارنة السلسلة

ولذلك، فمن الأفضل استخدام == للعمليات الرقمية وطريقة يساوي () للعمليات المرتبطة بالسلسلة.لذلك، لمقارنة الكائنات، فإن طريقة يساوي () ستكون الاختيار الصحيح.

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