الفرق بين HashMap و Hashtable في جاوة

مؤلف: Laura McKinney
تاريخ الخلق: 2 أبريل 2021
تاريخ التحديث: 5 قد 2024
Anonim
Java Hash Table || What is Hash Table in Java || Difference between HashMap & HashTable - Part 6
فيديو: Java Hash Table || What is Hash Table in Java || Difference between HashMap & HashTable - Part 6

المحتوى


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

لننظر إلى مقارنة الرسم البياني الموضح أدناه لمعرفة المزيد من الاختلافات بين HashMap و Hashtable.

  1. رسم بياني للمقارنة
  2. تعريف
  3. الاختلافات الرئيسية
  4. التشابه
  5. خاتمة

رسم بياني للمقارنة

أساس للمقارنةخريطة التجزئةجدول هاش
تنفيذ / تمديدتطبق فئة HashMap واجهة Map وتوسع فئة AbstractMap.يمتد Hashtable من فئة Dictionary Legacy ، لكن ، تمت إعادة تصميمه والآن يقوم أيضًا بتنفيذ واجهة Map.
تزامنHashMap غير متزامن ، وبالتالي ، فإن كائن HashMap غير آمن.تتم مزامنة Hashtable ، وبالتالي ، فإن كائن Hashtable آمن في سلسلة الرسائل.
مفاتيح / القيمةيمكن أن يُرجع المفتاح Null مرة واحدة فقط ، لكن يمكن أن تُرجع القيمة Null أي عدد من الوقت.لا يمكن أن يُرجع المفتاح Null لأنه يُستخدم للحصول على رمز التجزئة الذي سيتم استخدامه ك فهرس لجدول التجزئة ، ولا يمكن أن تُرجع القيمة Null.
القدرة الأولية الافتراضيةالسعة المبدئية الافتراضية لـ HashMap هي 16.السعة المبدئية الافتراضية لـ Hashtable هي 11.
العبوريتم اجتياز HashMap بواسطة Iterator.مثل Map class Hashtable أيضًا لا يدعم Iterator مباشرة من أجل اجتيازه ، وبالتالي ، فإنه يستخدم Enumerator.


تعريف HashMap

HashMap هي الفئة التي تنفذ خريطة واجهة ويمتد AbstractMap يستخدم الفصل جدول التجزئة. يشير كائن HashMap إلى مجموعة / مجموعة من إقران حيث يتم تعيين كل مفتاح إلى قيمة معينة. يجب أن تكون المفاتيح في مجموعة فريدة من نوعها لأنها تستخدم لاسترداد القيمة. من ناحية أخرى ، يمكن تكرار القيم في مجموعة. إعلان فئة HashMap ومنشئي HashMapclass كالتالي:

/ * K يمثل المفتاح ، ويمثل V القيمة * / class HashMap / * مُنشئو فئة HashMap * / HashMap () HashMap (خريطة <؟ يمتد K ،؟ يمتد V> m) HashMap (سعة سعة)

المُنشئ الأول هو مُنشئ افتراضي يقوم بتهيئة كائن فارغ من HashMap بسعة افتراضية تبلغ 16 ونسبة تعبئة افتراضي قدرها 0.75. يقوم المُنشئ الثاني بتهيئة خريطة التجزئة بقيمة m. ينشئ المُنشئ الثالث خريطة تجزئة ذات السعة الأولية المقابلة للقيمة الواردة في الوسيطة "السعة". يقوم المُنشئ الرابع بتهيئة خريطة التجزئة بسعة ونسبة تعبئة متوفرة في المعلمات. دعونا الآن نتعلم كيفية تغذية الإدخالات في خريطة التجزئة.


Hashmap hm = new Hashmap ()؛ hm.put ("Ajay"، 275)؛ hm.put ("Vijay"، 250)؛ hm.put ("Jonny"، 150) ؛ hm.put ("Jordan"، 200)؛ System.out.ln (hm) ؛ / * output * / {Vijay = 250 ، Jonny = 150 ، Ajay = 275 ، Jordan = 200}

في الرمز أعلاه ، يمكنك أن ترى أنني قمت بإنشاء كائن HashMap فارغ جلالة مع السعة الأولية الافتراضية ونسبة التعبئة الافتراضية. ثم أدخلت أربعة إدخالات في خريطة التجزئة باستخدام طريقة put (K ، V) التي تحدد مفتاح القيمة. يمكنك ملاحظة أن الإدخالات لا يتم إدارتها في تسلسل تقوم بإطعامهم لأن ترتيب الإدراج غير ثابت. الآن ، ضع في اعتبارك حالة لديك بالفعل إدخال في خريطة التجزئة وبعد ذلك تحاول إدراج وضع (K1 ، V5) ، بمعنى أنك تحاول تعيين نفس المفتاح بقيمة مختلفة. بعد ذلك ، ستحل طريقة الوضع محل القيمة القديمة V1 بالقيمة الجديدة V2 وتُرجع القيمة القديمة V1 ، وإلا ، إذا لم نحاول أبدًا استبدال قيمة المفتاح ، فسوف تُرجع الطريقة قيمة فارغة لهذا المفتاح.

تعريف Hashtable

Hashtable هي الفئة التي تمتد قاموس الفئة التي هي فئة إرث وإعادة هندستها لتنفيذ خريطة واجهه المستخدم. يستخدم Hashtable جدول التجزئة مثل بنية البيانات الخاصة به. يشبه Hashtable HashMap حيث يشير أيضًا كائن Hashtable إلى مجموعة الإدخالات حيث يكون كل إدخال زوجًا من . يجب أن تكون جميع المفاتيح في مجموعة فريدة من ناحية أخرى ، ويمكن تكرار القيم. تستخدم المفاتيح بشكل خاص للحصول على قيمة شفرة التجزئة التي تحدد الفهرس ، حيث سيتم تخزين الزوج في جدول التجزئة. في جدول التجزئة ، لا يمكن لأي مفتاح أو قيمة إرجاع مؤشر Null. دعونا نرى إعلان فئة Hashtable وبناة فئة hashtable.

/ * K تحدد المفتاح و V تحدد القيمة المرتبطة بـ * / class Hashtable / * منشئو Hashtable * / Hashtable () Hashtable (حجم int) Hashtable (حجم int ، float fillRatio) Hashtable (خريطة <؟ يمتد K ،؟ يمتد V> m)

في التعليمة البرمجية أعلاه ، فإن المُنشئ الأول هو مُنشئ افتراضي يُنشئ كائنًا فارغًا من فئة Hashtable ، وحجمه الافتراضي هو 11 ونسبة التعبئة الافتراضية هي 0.75. ينشئ المُنشئ الثاني جدول تجزئة بالحجم المقابل للقيمة الواردة في المعلمة "الحجم". ينشئ المُنشئ الثالث جدول تجزئة مع حجم ونسبة تعبئة متوفرة في المعلمة. المُنشئ الرابع تهيئة جدول التجزئة بالقيمة m. دعونا الآن نتعلم كيفية إدراج الزوج في جدول التجزئة.

Hashtable ht = new Hashtable ()؛ ht.put (new hashCode (2)، 275)؛ ht.put (new hashCode (12)، 250)؛ ht.put (new hashCode (16)، 150)؛ ht.put (new hashCode (8)، 200)؛ System.out.ln (ht)؛ / * الإخراج * / {12 = 250 ، 16 = 150،2y = 275 ، 8 = 200}

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

  1. و HashMap تنفذ خريطة واجهة ويمتد فئة مجردة ، AbstractMap في حين أن Hashtable يمتد الفصل التجريدي قاموس، والتي تعد أيضًا فئة Legacy ، أعيد تصميمها لاحقًا خريطة واجهه المستخدم.
  2. الكائن HashMap هو غير المتزامنة بمعنى أنه يمكن تشغيل مؤشرات ترابط متعددة في نفس الوقت ، وبالتالي ، فإنه لا يعترض على سلسلة الرسائل بشكل آمن. من ناحية أخرى ، كائنات Hashtable هي تزامن على سبيل المثال ، إذا أراد مؤشر ترابط العمل على كائن من Hashtable ، فيجب عليه الحصول على تأمين على هذا الكائن حتى لا يتمكن أي مؤشر ترابط آخر من الوصول إلى هذا الكائن ، وبالتالي فهو آمن.
  3. في مفتاح HashMap يمكن أن يعود لاغية مرة واحدة فقط، والقيمة يمكن أن يعود فارغة عدة مرات. من ناحية أخرى ، لا يمكن لأي مفتاح إرجاع Null لأنه يستخدم للحصول على قيمة شفرة التجزئة التي يتم استخدامها كمؤشر لتخزين يمكن للزوج ولا القيمة إرجاع Null.
  4. السعة الافتراضية لجدول التجزئة في فئة HashMap هي 16 في حين أن السعة الافتراضية لجدول التجزئة في Hashtable هي 11.
  5. ال مكرر يمكن اجتياز إدخالات Hashmap. من ناحية أخرى ، فإن Hashtable لا يدعم مباشرة Iterator وبالتالي ، بشكل عام العداد يستخدم لاجتياز الادخالات في Hashtable.

التشابه:

  • HashMap و Hashtable كلاهما يستخدم بنية بيانات جدول التجزئة.
  • HashMap و Hashtable كلا تنفذ خريطة واجهه المستخدم
  • لا يتم الاحتفاظ ترتيب الإدراج في كل من HashMap و Hashtable وبناءً على شفرة التجزئة التي تم الحصول عليها باستخدام المفاتيح.
  • في HashMap و Hashtable ، يجب أن تكون المفاتيح فريد في حين أن القيم يمكن أن تكون مكررة.
  • HashMap و Hashtable على حد سواء يمكن أن تحتوي كائنات غير متجانسة لكل من المفاتيح والقيم.
  • HashMap و Hashtable ، كلاهما ينفذ تسلسل و Cloneable واجهات ولكن لا ، وصول عشوائي.
  • HashMap و Hashtable على حد سواء لديها نسبة التعبئة الافتراضية 0.75.
  • HashMap و Hashtable كلاهما أفضل لاسترجاع أو يبحث عمليات.

خاتمة:

HashMap أفضل في الأداء حيث أن كائناته غير متزامنة ويمكن أن تعمل مؤشرات ترابط متعددة عليه في نفس الوقت وبالتالي فهي أسرع من Hashtable.