logo

כיצד להשוות שני אובייקטים ב-Java

אובייקט ג'אווה class הוא מחלקת העל של כל מחלקות ה-Java. כל מחלקות Java מיישמות את מחלקת האובייקט כברירת מחדל. מחלקת Java Object מספקת את שתי השיטות החשובות ל להשוות שניים אובייקטים ב-Java , כלומר שווים() ו hashCode() שיטה. בחלק זה נלמד כיצד שווים() ו hashCode() השיטה עובדת. יחד עם זה, נלמד גם כיצד להשוות בין שני אובייקטים ב-Java עם דוגמאות מתאימות.

Java מספקת את שתי השיטות של מחלקת Object להשוואת האובייקטים הן כדלקמן:

  • שיטה Java equals()
  • שיטת Java hashCode()

שיטה Java equals()

ה שווים() השיטה של ​​המחלקה Object משווה את השוויון של שני אובייקטים. שני האובייקטים יהיו שווים אם הם חולקים את אותה כתובת זיכרון.

תחביר:

 public boolean equals(Object obj) 

השיטה מנתחת אובייקט התייחסות כפרמטר. זה מחזיר אמת אם האובייקטים שווים, אחרת מחזיר false.

ייתכן גם שאובייקט שווה לאובייקט נתון אחר, אז השיטה equals() תעקוב אחר ה- יחס שקילות להשוות בין החפצים.

    רפלקסיבי:אם איקס הוא התייחסות שאינה אפסית, הקריאה של x.equals(x) חייב להחזיר אמת.סימטרי:אם שתי ההפניות שאינן אפס הן איקס ו y, x.equals(y) יחזור נָכוֹן אם ורק אם y.equals(x) לַחֲזוֹר נָכוֹן .טרנזיטיבי:אם שלוש הפניות שאינן אפס הן x,y , ו z, x.equals(z) גם יחזור נָכוֹן אם x.equals(y ) ו y.equals(z) שניהם מחזירים נָכוֹן .עִקבִי:אם שתי ההפניות שאינן אפס הן איקס ו ו , הקריאה המרובה של x.equals(y) מחזיר כל הזמן נכון או שקר. הוא אינו מספק מידע כלשהו שנעשה בו שימוש בהשוואה.
  • לכל התייחסות שאינה אפס x, x.equals(null) מחזיר false.

בקיצור, לכל התייחסות שאינה אפס תגיד איקס ו ו , הוא מחזיר אמת אם ורק אם שתי ההפניות מתייחסות לאותו אובייקט.

זכור: כאשר אנו מחליפים את שיטת equals() יש צורך לעקוף את שיטת hashCode() . עקיפה פעל בהתאם למוסכמה עבור שיטת hashCode() הקובעת, לאובייקט השווה חייב להיות קוד hash שווה.

instanceof ב-java

דוגמה לשיטת equals()

בדוגמה הבאה, יצרנו בַּנַאִי של ה לְהַכפִּיל ו ארוך class ומעביר ערכים מתאימים, כארגומנט המאוחסן באובייקטים שלהם, בהתאמה.

לאחר מכן, במשפט println הראשון, הפעלנו את המתודה equals() וננתח אובייקט y כפרמטר שמשווה את האובייקט x ו-y. זה חוזר שֶׁקֶר כי x מחזיק את הערך הכפול ו-y מחזיק את הערך הארוך שאינו שווה.

באופן דומה, במשפט println השני, הפעלנו את המתודה equals() ומנתחים את אותו ערך כמו בבנאי של המחלקה Double. זה חוזר נָכוֹן כי האובייקט של מחלקה כפולה כלומר x מחזיק באותו ערך כמו שעברנו בשיטת equals() .

ObjectComparisonExample.java

 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 

ההבדל בין == אופרטור לשיטה שווה().

ב Java , ה == אופרטור משווה ששתי הפניות זהות או לא. ואילו ה שווים() השיטה משווה בין שני אובייקטים.

חפצים הם שווה כאשר יש להם אותו מצב (בדרך כלל משווים משתנים). חפצים הם זֵהֶה כאשר הם חולקים את הזהות המעמדית.

למשל, הביטוי obj1==obj2 בוחן את הזהות, לא את השוויון. בעוד הביטוי obj1.equals(obj2) משווה שוויון.

שיטת Java hashCode()

ב-Java, קוד hash הוא ערך של מספר שלם חתום ב-32 סיביות. זהו מזהה ייחודי המסופק על ידי JVM לאובייקט Java. כל אובייקט Java משויך לקוד ה-hash. קוד הגיבוב מנוהל על ידי מבנה נתונים מבוסס hash, כגון HashTable, HashSet וכו'.

זכור: כאשר אנו מחליפים את שיטת equals() יש צורך לעקוף גם את שיטת hashCode().

תחביר:

מתמטיקה אקראית java
 public int hashCode() 

הוא מחזיר ערך קוד hash שנוצר באקראי של האובייקט שהוא ייחודי לכל מופע. הערך שנוצר באקראי עשוי להשתנות במהלך מספר הפעולות של התוכנית.

החוזה הכללי עבור hashCode הוא:

  • כאשר הוא מופעל יותר מפעם אחת במהלך ביצוע יישום, שיטת hashCode() תחזיר באופן עקבי את אותו קוד hash (ערך שלם). שימו לב שאין לשנות את האובייקט.
  • אם שני האובייקטים שווים לפי שיטת equals() אז הפעלת שיטת hashCode() בשני האובייקטים הללו חייבת לייצר את אותו ערך שלם.
  • אין צורך שאם שני האובייקטים אינם שווים לפי שיטת equals() אז הפעלת שיטת hashCode() בשני האובייקטים הללו עשויה לייצר ערך שלם מובחן. זה אומר שהוא יכול לייצר את אותו קוד hash עבור שני האובייקטים.

דוגמה לשיטת hashCode()

בדוגמה הבאה, יצרנו שתי מחלקות Employee.java ו HashCodeExample.java .

במחלקת Employee, הגדרנו שני שדות regno מסוג int ושם סוג String. לאחר מכן, יצרנו בנאי של המחלקה Employee ומעבירים את שני השדות הללו כפרמטר.

כדי לבצע את ההשוואה של אובייקטים, יצרנו מחלקה נפרדת בשם HashCodeExample . במחלקה זו, יצרנו שני מופעים של מחלקה Employee, כלומר. emp1 ו emp2 . לאחר מכן, הפעלנו את שיטת hashCode() באמצעות אובייקטים. שמרנו את ערך קוד ה-hash במשתנה א ו ב , בהתאמה.

Employee.java

 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)); } } 

תְפוּקָה:

אתרים כמו coomeet
 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

עקיפת שיטת equals()

אנו יכולים לעקוף את שיטת equals() באופן הבא אם ברצוננו לספק יישום משלו.

 //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(); } 

קטע הקוד שלמעלה מראה ששני עובדים יהיו שווים אם הם מאוחסנים באותה כתובת זיכרון או שיש להם אותו regno. כאשר אנו מריצים את התוכנית (HashCodeExample.java) עם קטע הקוד שלמעלה, נקבל את הפלט הבא.

תְפוּקָה:

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