ההבדל בין HashMap ל- Hashtable בג'אווה

מְחַבֵּר: Laura McKinney
תאריך הבריאה: 2 אַפּרִיל 2021
תאריך עדכון: 5 מאי 2024
Anonim
ההבדל בין HashMap ל- Hashtable בג'אווה - טכנולוגיה
ההבדל בין HashMap ל- Hashtable בג'אווה - טכנולוגיה

תוֹכֶן


HashMap ו- Hashtable, שניהם משמשים לייצוג א קבוצת חפצים שמיוצגים ב זוג. כל אחד זוג נקרא כניסה חפץ. ה אוסף של ערכים מופנה על ידי מושא HashMap ו- Hashtable. המפתחות באוסף חייבים להיות ייחודיים או ייחודיים. ההבדל בין HashMap ל- Hashtable הוא זה מפת גיבוב מיישם במיוחד את ממשק המפה ואילו, טבלת גיבוב מרחיב את כיתת המילון (כיתת מדור קודם) המוחזרת מחדש ליישום ממשק המפה. ההבדל החשוב הנוסף הוא שאובייקטים של HashMap הם לא מסונכרן ואילו האובייקטים של Hashtable הם מסונכרנים.

בואו נראה לתרשים ההשוואה המוצג להלן כדי ללמוד עוד כמה הבדלים בין HashMap ל- Hashtable.

  1. טבלת השוואה
  2. הגדרה
  3. הבדלים עיקריים
  4. קווי דמיון
  5. סיכום

טבלת השוואה

בסיס להשוואהמפת גיבובטבלת גיבוב
הטמעה / הרחבהכיתת HashMap מיישמת את ממשק המפה ומרחיבה את מחלקת AbstractMap.ה- Hashtable משתרע משיעור מילון מורשת אך הוא מהונדס מחדש ועכשיו הוא גם מיישם את ממשק המפה.
סנכרוןHashMap אינו מסונכרן, ומכאן שאובייקט HashMap אינו מוגן בהברגה.Hashtable מסונכרן, ומכאן שאובייקט Hashtable הוא חוט בטוח.
מפתחות / ערךמקש יכול להחזיר את Null פעם אחת בלבד, אך ערך יכול להחזיר את Null בכל מספר זמן.מקש אינו יכול להחזיר את Null שכן הוא משמש להשגת קוד ה- Hash שישמש כאינדקס של טבלת ה- Hash, וגם ערך אינו יכול להחזיר את Null.
קיבולת ראשונית ברירת מחדלקיבולת ראשונית ברירת המחדל של HashMap היא 16.קיבולת ראשונית ברירת המחדל של Hashtable היא 11.
חוצהHashMap חוצה איטרטור.כמו ש- Map Hashtable גם אינו תומך ישירות ב- Iterator לצורך חצייה ומכאן שהוא משתמש ב- Enumerator.


הגדרת HashMap

HashMap הוא שיעור שמיישם את ה- מפה ממשק ומרחיב את מפת מופשט הכיתה משתמשת בטבלת החשיש. האובייקט של HashMap מתייחס לאוסף / סט של זוג בו כל מפתח ממופה לערך מסוים. מפתחות באוסף חייבים להיות ייחודיים מכיוון שהם משמשים לאחזור הערך. מצד שני, ניתן לשכפל את הערכים באוסף. ההכרזה על כיתת HashMap והבנאים של HashMapclass הם כדלקמן:

/ * K מייצג מפתח, ו- V מייצג ערך * / HashMap בכיתה / * בוני מחלקת HashMap * / HashMap () HashMap (מפה <? מרחיב K,? משתרע V> m) HashMap (קיבולת int) HashMap (קיבולת int, מילוי צף רטיו)

הקבלן הראשון הוא קונסטרוקטור ברירת מחדל המאתחל אובייקט ריק של HashMap עם קיבולת ברירת מחדל של 16 ויחס מילוי ברירת המחדל של 0.75. הקבלן השני מאתחל את מפת החשיש בערך של m. הקבלן השלישי יוצר מפת חשיש עם הקיבולת הראשונית המתאימה לערך המסופק בטיעון "קיבולת". הקונסטרוקטור הרביעי מאתחל מפת חשיש עם קיבולת ויחס מילוי המסופקים בפרמטרים. הבה נלמד כעת כיצד להזין את הערכים במפת חשיש.


Hashmap hm = Hashmap חדש (); hm.put ("אג'יי", 275); hm.put ("Vijay", 250); hm.put ("ג'וני", 150); hm.put ("ירדן", 200); System.out.ln (hm); / * פלט * / {וויג'יי = 250, ג'וני = 150, אג'יי = 275, ירדן = 200}

בקוד שלמעלה אתה יכול לראות שיצרתי אובייקט HashMap ריק hm עם קיבולת ראשונית ברירת מחדל ויחס מילוי ברירת מחדל. ואז הכנסתי ארבע ערכים במפת החשיש בשיטת put (K, V) הממפה את המפתח לערך. אתה יכול לראות שהערכים אינם ערוכים ברצף שאתה מאכיל אותם מכיוון שסדר הכניסה אינו קבוע. כעת, שקלו מקרה שכבר יש לכם ערך במפת ה- hash ולאחר מכן אתה מנסה להכניס put (K1, V5), כלומר אתה מנסה למפות את אותו מפתח עם ערך אחר. ואז שיטת ה- put תחליף את הערך הישן V1 בערך החדש V2 ותחזיר את הערך הישן V1, אחרת, אם לעולם לא ננסה להחליף ערך של מפתח אז שיטת put מחזירה את Null עבור אותו מפתח.

הגדרת Hashtable

Hashtable הוא כיתה המרחיבה את מילון כיתה שהיא כיתת מורשת ונמצאת מחדש בהטמעת היישום מפה ממשק. ה- Hashtable משתמש בטבלת ה- hash כמבנה הנתונים שלה. ה- Hashtable דומה ל- HashMap שכן גם כאן האובייקט של Hashtable מתייחס לאוסף הרשומות בהן כל רשומה היא זוג של . מצד שני כל המפתחות באוסף חייבים להיות ייחודיים, ניתן לשכפל את הערכים. המקשים משמשים במיוחד להשגת ערך קוד ה- hash שמחליט את האינדקס, היכן הזוג יאוחסן בטבלת חשיש. בטבלת חשיש, לא מפתח ולא ערך יכולים להחזיר את המצביע Null. בואו נראה את ההכרזה על מעמד האשטבל ובוני כיתת hashtable.

/ * K מציין את המפתח ו- V מציין את הערך המשויך למפתח * / class Hashtable / * מבני Hashtable * / Hashtable () Hashtable (גודל int) Hashtable (גודל int, float fillRatio) Hashtable (מפה <? משתרעת K,? מרחיבה V> m)

בקוד לעיל, הקונסטרוקטור הראשון הוא קונסטרוקטור ברירת מחדל שיוצר אובייקט ריק ממעמד Hashtable, גודל ברירת המחדל שלו הוא 11 ויחס המילוי של ברירת המחדל הוא 0.75. הקבלן השני יוצר טבלת חשיש בגודל המתאים לערך המסופק בפרמטר "גודל". הקבלן השלישי יוצר טבלת חשיש בגודל ויחס מילוי המסופקים בפרמטר. הקבלן הרביעי מאתחל את טבלת החשיש עם הערך m. כעת נלמד כיצד להכניס את ה- זוג בטבלת החשיש.

Hashtable ht = Hashtable חדש (); ht.put (hashCode חדש (2), 275); ht.put (hashCode חדש (12), 250); ht.put (hashCode חדש (16), 150); ht.put (hashCode חדש (8), 200); System.out.ln (ht); / * פלט * / {12 = 250, 16 = 150,2y = 275, 8 = 200}

בקוד לעיל יצרתי אובייקט ריק מ- Hashtable והכנסתי ארבע ערכים בשיטת put (). בשיטת הפנימי התקשרתי ל- hashCode () המחשבת ומחזירה את ערך קוד ה- hash אשר ישמש כערך האינדקס של אובייקט הכניסה. כפי שאתה יכול לראות לא ציינתי את גודל טבלת החשיש כך שברירת המחדל היא תהיה 11. גם כאן, סדר ההכנסה לא נשמר ומכאן, כאשר ערכי עריכה לא הופיעו ברצף שהוא מוזן.

  1. ה- HashMap מיישם מפה ממשק ומרחיב כיתה מופשטת, מפת מופשט ואילו, שולחן האשטה מרחיב את המעמד המופשט מילון, שהיא גם כיתת Legacy, בהמשך הוחל ליישם מפה ממשק.
  2. אובייקט HashMap הוא לא מסונכרן כלומר חוטים מרובים יכולים לפעול עליו בו זמנית ומכאן שהוא מתנגד לא לשרשור בטוח. מצד שני, מושאי ה- Hashtable הם מסונכרנים כלומר, אם חוט רוצה לפעול על אובייקט של Hashtable, עליו לרכוש מנעול על אותו אובייקט כך ששום חוט אחר לא יוכל לגשת לאובייקט הזה ומכאן שהוא בטוח בחוט.
  3. ב- HashMap המפתח יכול לחזור אפס רק פעם אחת, וערך יכול לחזור בטל מספר פעמים. מצד שני, מפתח לעולם לא יכול להחזיר את Null כפי שהיה נהג להשיג את ערך קוד ה- hash המשמש כאינדקס לאחסון ה- זוג וגם ערך לא יכול להחזיר את Null.
  4. קיבולת ברירת המחדל של טבלת חשיש במחלקת HashMap היא 16 ואילו, קיבולת ברירת המחדל של טבלת חשיש ב- Hashtable היא 11.
  5. ה איטרטור יכול לחצות ערכי Hashmap. מצד שני, ה- Hashtable אינו תומך ישירות באיטטור ומכאן, באופן כללי מונה משמש לחציית הערכים ב- Hashtable.

קווי דמיון:

  • שניהם HashMap ו- Hashtable משתמשים במבנה הנתונים של טבלת גיבוב.
  • HashMap ו- Hashtable שניהם מיישמים מפה ממשק
  • צו הכניסה לא נשמר הן ב- HashMap והן ב- Hashtable ומבוסס על קוד ה- hash המתקבל באמצעות מפתחות.
  • ב- HashMap וב- Hashtable, מפתחות חייבים להיות ייחודי ואילו הערכים יכולים להיות משוכפל.
  • HashMap ו- Hashtable יכולים להכיל חפצים הטרוגניים עבור מפתחות וערכים כאחד.
  • HashMap ו- Hashtable, שניהם מיישמים ניתן לערוך סדרתיות ו ניתן לסגירה ממשקים אבל לא, גישה אקראית.
  • ל- HashMap ו- Hashtable יש יחס מילוי ברירת מחדל 0.75.
  • שניהם HashMap ו- Hashtable הם הטובים ביותר לשליפה או חיפוש פעולות.

סיכום:

HashMap הוא טוב יותר בביצועים מכיוון שהאובייקטים שלו אינם מסונכרנים וכמה חוטים יכולים לפעול עליו באותו הזמן ומכאן שהוא מהיר יותר מ- Hashtable.