1. الفرق بين hashmap و hashtable
دعونا نلقي نظرة أولاً على تعريف فئتين
يمتد علامة التجزئة من الطبقة العامة على خريطة قاموس ، clonable ، java.io.serializable
يمتد HashMap من الطبقة العامة خريطة خريطة الخريطة الملخصية ، قابلة للاستنساخ ، قابلة للتسلسل
يمكن أن نرى أن الوراثة الهاوية من القاموس وراث hashmap من الخريطة التجريدية
طريقة وضع علامة التجزئة على النحو التالي
Public Synchronized V put (Key Key ، v value) {// ######### ملاحظة هنا 1 // تأكد من أن القيمة ليست فارغة إذا (value == null) {// ####### ملاحظة هنا 2 رمي nullpointerxception () ؛ } // يتأكد من أن المفتاح غير موجود بالفعل. علامة تبويب الدخول [] = الجدول ؛ int hash = key.hashCode () ؛ // ######## ملاحظة هنا 3 int index = (hash & 0x7fffffff) ٪ tab.length ؛ لـ (الإدخال e = tab [index] ؛ e! = null ؛ e = e.next) {if ((e.hash == hash) && e.key.equals (key)) {v old = e.value ؛ e.value = القيمة ؛ العودة القديمة. }} modcount ++ ؛ if (count> = عتبة) {// إعادة صياغة الجدول إذا تم تجاوز العتبة إعادة صياغة () ؛ علامة التبويب = الجدول ؛ index = (hash & 0x7fffffff) ٪ tab.length ؛ } // ينشئ الإدخال الجديد. الإدخال e = علامة التبويب [الفهرس] ؛ علامة التبويب [الفهرس] = إدخال جديد (التجزئة ، المفتاح ، القيمة ، ه) ؛ count ++ ؛ العودة لاغية. } ملاحظة 1 الطريقة متزامنة
الملاحظة 2 طريقة لا تسمح القيمة == فارغة
ملاحظة 3 ، تستدعي الطريقة طريقة HashCode للمفتاح. إذا كان المفتاح == فارغًا ، فسيتم طرح استثناء مؤشر فارغ. طريقة وضع hashmap كما يلي.
public v put (k key ، v value) {// ######### ملاحظة هنا 1 if (key == null) // ######## proceed هنا 2 return putfornullkey (value) ؛ int hash = hash (key.hashCode ()) ؛ int i = indexfor (hash ، table.length) ؛ لـ (الإدخال e = table [i] ؛ e! = null ؛ e = e.next) {object k ؛ if ( e.value = القيمة ؛ eRecordAccess (هذا) ؛ إرجاع Oldvalue ؛ }} modcount ++ ؛ addentry (التجزئة ، المفتاح ، القيمة ، i) ؛ // ######## ملاحظة هنا إرجاع NULL ؛ } ملاحظة 1 الطريقة غير متزامنة
تتيح طريقة الملاحظة 2 المفتاح == فارغ
ملاحظة 3 لا تقوم الطريقة بأي مكالمات إلى القيمة ، لذلك يُسمح بأن تكون فارغة.
التجديد:
يحتوي علامة التجزئة على طريقة تحتوي على سوء فهم بسهولة ، لذلك تمت إزالتها في hashmap.
بالطبع ، يستخدم كلا الفئتين أساليب ConteKekey و ContainSvalue.
| هاشماب | علامة التجزئة | |
| فئة الوالدين | الملخص | قاموس |
| هل هو متزامن | لا | نعم |
| K ، يمكن v null | نعم | لا |
HashMap هو تنفيذ خفيف الوزن لـ Hashtable (التنفيذ غير الآمن). انهم جميعا أكمل واجهة الخريطة. الفرق الرئيسي هو أن hashmap يسمح مفاتيح فارغة. بسبب عدم وجود آمن ، قد يكون أكثر كفاءة من علامة التصنيف.
يسمح HashMap NULL كمفتاح أو قيمة للإدخال ، في حين أن علامة التجزئة لا.
HashMap يزيل علامة التجزئة التي تحتوي على طريقة ويغيرها إلى Value و Contensekey. لأن الطريقة التي تحتوي على سهولة التسبب في سوء فهم.
ترث علامة التجزئة من فئة القاموس ، و HashMap هو تنفيذ واجهة MAP التي أدخلتها Java 1.2.
الفرق الأكبر هو أن طريقة التصنيف هي مزامنة ، في حين أن HashMap ليس كذلك. عندما تتوصل إلى ترابط متعددة ، فإنها لا تحتاج إلى مزامنة لطرقها نفسها ، ويجب أن توفر HashMap التزامن الخارجي (Collections.synchronizedMap).
خوارزميات التجزئة/إعادة صياغة تستخدمها Hashtable و HashMap متماثلان تقريبًا ، لذلك لن يكون هناك فرق كبير في الأداء.
تلخيص:
يُسمح للقيم الرئيسية في HashMap أن تكون فارغة وغير متزامنة
لا يُسمح بالقيمة الرئيسية في علامة التجزئة أن تكون فارغة ومزامنة
الميراث مختلف ، لكن كلاهما ينفذ واجهة الخريطة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.