הבדל מפתח – שווה לעומת hashCode ב-Java
השווה דומה לאופרטור==, שמטרתו לבדוק זהות אובייקט ולא שוויון אובייקט. ה-hashCode הוא שיטה שבאמצעותה מחלקה מפרקת באופן מרומז או מפורש את הנתונים המאוחסנים במופע של המחלקה לערך hash יחיד, שהוא מספר שלם עם סימן 32 סיביות. ההבדל העיקרי בין equals ל-hashCode ב-Java הוא שה-equals משמש להשוואה בין שני אובייקטים בעוד שה-hashCode משמש ב-hash כדי להחליט לאיזו קבוצה יש לסווג אובייקט.
מה זה שווה ב-Java?
שיטה שווה משמשת להשוואה בין שני אובייקטים.שיטת ברירת המחדל שווה מוגדרת במחלקת האובייקט. יישום זה דומה לאופרטור==. שני הפניות לאובייקט שווים רק אם הם מצביעים על אותו אובייקט. אפשר לעקוף את שיטת השווה.
איור 01: תוכנית Java עם שווה
ההצהרה System.out.println(s1.equals(s2)) תיתן את התשובה שקר מכיוון ש-s1 ו-s2 מתייחסים לשני אובייקטים שונים. זה היה דומה להצהרה, System.out.println(s1==s2);
ההצהרה System.out.println(s1.equals(s3)) תיתן את התשובה true כי s1 ו-s3 מתייחסים לאותו אובייקט. זה היה דומה להצהרה, System.out.println(s1==s3);
אין שיטת שווה בכיתה Student. לכן, השווים במחלקה Object נקראים. True מוצג רק אם הפניה לאובייקט מכוונת לאותו אובייקט.
איור 02: תוכנית ג'אווה עם שווים
לפי התוכנית שלעיל, שיטת השווה מבוטלת. אובייקט מועבר לשיטה, והוא מועבר ל-Student. לאחר מכן, ערכי המזהה נבדקים. אם ערכי המזהה דומים, הוא יחזיר אמת. אם לא, זה יחזיר false. המזהים של s1 ו-s2 דומים. אז זה ידפיס נכון. המזהים של s1 ו-s3 דומים גם הם, כך שהם יודפסו נכון.
מהו hashCode ב-Java?
ה-hashCode משמש בגיבוב כדי להחליט לאיזו קבוצה יש לסווג אובייקט. קבוצת אובייקטים יכולה לשתף את אותו hashCode. פונקציית גיבוב נכונה יכולה לפזר אובייקטים באופן שווה לקבוצות שונות.
ל-hashCode נכון יכולים להיות מאפיינים כדלקמן.נניח שיש שני אובייקטים כמו obj1 ו-obj2. אם obj1.equals(obj2) נכון, אז obj1.hashCode() שווה ל-obj2.hashCode(). אם obj1.equals(obj2) הוא false, אין צורך ש-obj1.hashCode() אינו שווה ל-obj2.hashCode(). שני האובייקטים הלא שווים עשויים להיות בעלי אותו hashCode.
איור 03: כיתת תלמידים עם שווה וקוד hash
איור 04: תוכנית ראשית
הכיתה Student מכילה את שיטות equals ו-hashCode. שיטת שווה בכיתה Student תקבל אובייקט. אם האובייקט הוא null, הוא יחזיר false.אם המחלקות של האובייקטים אינן זהות, היא תחזיר false. ערכי המזהה נבדקים בשני האובייקטים. אם הם דומים, זה יחזור נכון. אחרת זה יחזיר false.
בתוכנית הראשית נוצרים אובייקטים s1 ו-s2. בעת קריאה ל-s1.equals(s2) ייתן true כי השיטה equals היא עוקפת והיא בודקת את ערכי ה-id של שני האובייקטים. למרות שהם מתייחסים לשני אובייקטים, התשובה נכונה כי ערכי ה-id של s1 ו-s2 זהים. מכיוון שה-s1.equals(s2) נכון, ה-hashCode של s1 ו-s2 צריך להיות שווה. הדפסת ה-hashCode של s1 ו-s2 נותנת את אותו ערך. ניתן להשתמש בשיטת hashCode עם אוספים כגון HashMap.
מה ההבדל בין שווים ל-hashCode ב-Java?
שווה לעומת hashCode ב-Java |
|
equals היא שיטה ב-Java שפועלת בדומה לאופרטור==, כלומר לבדוק זהות אובייקט ולא שוויון אובייקט. | hashCode היא שיטה שבה מחלקה מפרקת באופן מרומז או מפורש את הנתונים המאוחסנים במופע של המחלקה לערך hash יחיד. |
שימוש | |
השיטה שווה משמשת להשוואה בין שני אובייקטים. | השיטה משמשת בגיבוב כדי להחליט באיזו קבוצה יש למקם אובייקט. |
סיכום – שווה לעומת hashCode ב-Java
ההבדל ב-equals וב-hashCode ב-Java הוא שה-equals משמש להשוואה בין שני אובייקטים בעוד שה-hashCode משמש ב-hash כדי להחליט לאיזו קבוצה יש לסווג אובייקט.