logo

كيفية مقارنة كائنين في جافا

كائن جافا class هي الفئة الفائقة لجميع فئات Java. تطبق كافة فئات Java فئة الكائن بشكل افتراضي. توفر فئة Java Object طريقتين مهمتين للقيام بذلك قارن بين اثنين الكائنات في جافا ، أي. يساوي () و رمز التجزئة () طريقة. في هذا القسم سوف نتعلم كيف يساوي () و رمز التجزئة () تعمل الطريقة. جنبا إلى جنب مع هذا، سوف نتعلم أيضا كيفية مقارنة كائنين في جافا مع الأمثلة المناسبة.

توفر Java طريقتين لفئة الكائن لمقارنة الكائنات كما يلي:

للحلقة في جافا
  • جافا تساوي () الطريقة
  • طريقة جافا hashCode ().

جافا تساوي () الطريقة

ال يساوي () طريقة فئة الكائن تقارن المساواة بين كائنين. سيكون الكائنان متساويين إذا كانا يشتركان في نفس عنوان الذاكرة.

بناء الجملة:

 public boolean equals(Object obj) 

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

من الممكن أيضًا أن يكون كائن ما مساويًا لكائن آخر، ثم تتبع طريقة يساوي () التابع علاقة التكافؤ لمقارنة الكائنات.

    انعكاسية:لو س هو مرجع غير فارغ، استدعاء س يساوي (س) يجب أن يعود صحيحا.متماثل:إذا كان المرجعان غير الفارغين س و ص، س يساوي (ص) سيعود حقيقي إذا وفقط إذا ص. يساوي (س) يعود حقيقي .متعد:إذا كانت المراجع الثلاثة غير الفارغة هي س، ص ، و ض، س. يساوي (ض) سوف يعود أيضا حقيقي لو x.يساوي(y ) و ص يساوي (ض) كلا العائدين حقيقي .ثابت:إذا كان المرجعان غير الفارغين س و و ، النداء المتعدد لـ س.يساوي (ذ) يُرجع باستمرار إما صواب أو خطأ. ولا يقدم أي معلومات مستخدمة في المقارنة.
  • لأي مرجع غير فارغ س، س. يساوي (خالية) يعود كاذبة.

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

يتذكر: عندما نتجاوز طريقة يساوي () فمن الضروري تجاوز طريقة hashCode (). التجاوز يتبع الاصطلاح الخاص بطريقة hashCode() التي تنص على أن الكائن المتساوي يجب أن يكون له رمز تجزئة متساوٍ.

مثال على طريقة يساوي ().

في المثال التالي، قمنا بإنشاء البناء التابع مزدوج و طويل class ويمرر القيم المقابلة، كوسيطة يتم تخزينها في كائناتها، على التوالي.

بعد ذلك، في عبارة println الأولى، قمنا باستدعاء طريقة يساوي () وتحليل كائن y كمعلمة تقارن الكائن x و y. يعود خطأ شنيع لأن x تحمل القيمة المزدوجة وy تحمل القيمة الطويلة غير المتساوية.

وبالمثل، في عبارة println الثانية، قمنا باستدعاء طريقة يساوي () وقمنا بتحليل نفس القيمة كما في مُنشئ الفئة Double . يعود حقيقي لأن الكائن من فئة مزدوجة، أي x يحمل نفس القيمة التي مررناها في طريقة يساوي ().

ObjectComparisonExample.java

dateformat.format جافا
 public class ObjectComparisonExample { public static void main(String[] args) { //creating constructor of the Double class Double x = new Double(123.45555); //creating constructor of the Long class Long y = new Long(9887544); //invoking the equals() method System.out.println('Objects are not equal, hence it returns ' + x.equals(y)); System.out.println('Objects are equal, hence it returns ' + x.equals(123.45555)); } } 

انتاج:

 Objects are not equal, hence it returns false Objects are equal, hence it returns true 

الفرق بين == عامل التشغيل وطريقة يساوي ().

في جافا ، ال == يقارن عامل التشغيل بين مرجعين متطابقين أم لا. في حين أن يساوي () طريقة تقارن كائنين.

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

الموضوع. تدمير

على سبيل المثال، التعبير obj1==obj2 يختبر الهوية، وليس المساواة. بينما التعبير obj1.equals(obj2) يقارن المساواة.

طريقة جافا hashCode ().

في Java، رمز التجزئة هو قيمة عددية موقعة 32 بت. إنه معرف فريد مقدم من JVM إلى كائن جافا. يرتبط كل كائن Java برمز التجزئة. تتم إدارة رمز التجزئة من خلال بنية بيانات قائمة على التجزئة، مثل HashTable وHashSet وما إلى ذلك.

يتذكر: عندما نتجاوز طريقة يساوي () فمن الضروري تجاوز طريقة hashCode () أيضًا.

بناء الجملة:

 public int hashCode() 

تقوم بإرجاع قيمة رمز التجزئة التي تم إنشاؤها عشوائيًا للكائن والتي تكون فريدة لكل مثيل. قد تتغير القيمة التي تم إنشاؤها عشوائيًا أثناء عمليات التنفيذ المتعددة للبرنامج.

العقد العام لـ hashCode هو:

  • عندما يتم استدعاؤه أكثر من مرة أثناء تنفيذ تطبيق ما، فإن طريقة hashCode() ستعيد باستمرار نفس رمز التجزئة (قيمة عددية). لاحظ أنه لا ينبغي تعديل الكائن.
  • إذا كان الكائنان متساويان وفقًا لطريقة يساوي () فإن استدعاء طريقة hashCode () على هذين الكائنين يجب أن ينتج نفس القيمة الصحيحة.
  • ليس من الضروري أنه إذا كان الكائنان غير متساويين وفقًا لطريقة يساوي () فإن استدعاء طريقة hashCode () على هذين الكائنين قد ينتج عنه قيمة عددية مميزة. وهذا يعني أنه يمكن أن ينتج نفس رمز التجزئة لكلا الكائنين.

مثال على طريقة hashCode()

في المثال التالي، قمنا بإنشاء فئتين الموظف.جافا و HashCodeExample.java .

في فئة الموظف، قمنا بتعريف حقلين من النوع int واسم النوع String. بعد ذلك، قمنا بإنشاء مُنشئ لفئة الموظف وتمرير هذين الحقلين كمعلمة.

لإجراء المقارنة بين الكائنات، قمنا بإنشاء فئة منفصلة تسمى HashCodeExample . في هذه الفئة، قمنا بإنشاء مثيلين لفئة الموظف، أي. emp1 و emp2 . بعد ذلك، قمنا باستدعاء طريقة hashCode() باستخدام الكائنات. لقد قمنا بتخزين قيمة رمز التجزئة في المتغير أ و ب ، على التوالى.

قاعدة بيانات خصائص الحمض

الموظف.جافا

 public class Employee { private int regno; private String name; //constructor of Employee class public Employee(int regno, String name) { this.name = name; this.regno = regno; } public int getRegno() { return regno; } public void setRegno(int Regno) { this.regno = regno; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

HashCodeExample.java

 public class HashcodeExample { public static void main(String[] args) { //creating two instances of the Employee class Employee emp1 = new Employee(918, 'Maria'); Employee emp2 = new Employee(918, 'Maria'); //invoking hashCode() method int a=emp1.hashCode(); int b=emp2.hashCode(); System.out.println('hashcode of emp1 = ' + a); System.out.println('hashcode of emp2 = ' + b); System.out.println('Comparing objects emp1 and emp2 = ' + emp1.equals(emp2)); } } 

انتاج:

 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

تجاوز طريقة يساوي ().

يمكننا تجاوز طريقة يساوي () بالطريقة التالية إذا أردنا توفير التنفيذ الخاص.

 //overriding equals() method @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; return this.getRegno() == ((Employee) obj). getRegno(); } 

يوضح مقتطف الكود أعلاه أن اثنين من الموظفين سيكونان متساويين إذا تم تخزينهما في نفس عنوان الذاكرة أو كان لديهما نفس السجل. عندما نقوم بتشغيل البرنامج (HashCodeExample.java) بمقتطف الكود أعلاه، نحصل على الإخراج التالي.

انتاج:

 hashcode of emp1 = 2032578917 hashcode of emp2 = 1531485190 Comparing objects emp1 and emp2 = true