إذا سمح لي أي شخص أن أصف آلية العمل لخريطة التجزئة ، فسوف أجيب ببساطة: "القواعد المستندة إلى التجزئة". هذه الجملة بسيطة للغاية ، ولكن قبل فهم هذه الجملة ، يجب علينا أولاً أن نفهم ما لا ، أليس كذلك؟
ما هو بيه
Hash هي ببساطة سلسلة فريدة تم الحصول عليها بعد تطبيق سمة المتغير/الكائن على خوارزمية معينة ، ويتم استخدام هذه السلسلة لتحديد تفرد المتغير/الكائن. يجب أن تلتزم وظيفة التجزئة الصحيحة بهذا المعيار.
عندما يتم تطبيق وظيفة التجزئة على نفس الكائن أو كائن متساوي ، يجب أن يعيد كل تنفيذ نفس القيمة. وبعبارة أخرى ، يجب أن يكون لكنيان متساويان نفس هاشك.
ملاحظة: ترث جميع كائنات Java طريقة HashCode () الافتراضية من فئة الكائن. تُرجع هذه الطريقة عنوان الكائن في الذاكرة كإجراء عدد صحيح.
مقدمة واحدة لفئة الدخول
تعريف الخريطة هو: كائن من مفتاح رسم الخرائط إلى القيمة. بسيطة جدا ، أليس كذلك؟
لذلك ، يجب أن تكون هناك آلية معينة في hashmap لتخزين أزواج القيم الرئيسية هذه. Make HashMap لديه إدخال فئة داخلية ، والذي يبدو هكذا.
دخول الفئة الثابتة <k ، v> map.entry <k ، v> {final k key ؛
بالطبع ، لدى فئة الدخول سمات لتخزين قيم المفاتيح. يتميز المفتاح بالنهائي. بعد ذلك نحاول أن نفهم معنى هذه المتغيرات.
ماذا تفعل طريقة PUT () بالفعل؟
قبل النظر في تنفيذ طريقة PUT ، من الضروري إلقاء نظرة على تخزين مثيل الدخول في المصفوفة.
/ ** الجدول ، يجب أن يكون طول الطول. /*** يربط القيمة المحددة بالمفتاح المحدد في هذه الخريطة. قيمة القيمة المراد ارتباطها بمفتاح تحديد* القيمة السابقة المرتبطة بـ </tt> ، أو* <tt> null </tt> إذا يمكن أن تشير العائد أيضًا إلى أن MAP* CANCLINGE CANNIGY <TT> NULL </tt> مفتاح </tt>.)*/public v put (k key ، value) {if (key == null) return putfornullkey (value) ؛ int has (key.hashCode ()) ؛ && (k = e.key) key || key.equals (k)) ، مفتاح ، كل) ؛
دعونا نشاهد خطوة بخطوة
بادئ ذي بدء ، تحقق مما إذا كان المفتاح فارغًا.
بعد ذلك ، يتم حساب قيمة تجزئة هذا المفتاح من خلال طريقة HashCode () المفتاح ، والتي يتم استخدامها لحساب الموضع في صفيف كائن الإدخال. يفترض مصمم JDK أن بعض الأشخاص قد يكتبون أساليب Hashcode () فقيرة للغاية ، وسيكون هناك بعض قيم التجزئة الكبيرة أو الصغيرة جدًا. لحل هذه المشكلة ، قدموا وظيفة تجزئة أخرى لقبول HashCode () للكائن وتحويلها إلى قدرة الصفيف.
التالي هو طريقة الفهرس (التجزئة ، الجدول ، الطول) ، التي تحسب الموقع الدقيق لتخزين كائن الإدخال.
التالي هو الجزء الرئيسي.
الجواب هو LinkedList. إذا كنت تتذكر ، فإن فئة الإدخال لديها متغير التالي ، يشير هذا المتغير دائمًا إلى المتغير التالي في السلسلة ، والذي يفي بالكامل بخصائص القائمة المرتبطة.
لذلك ، عند حدوث تصادم ، سيتم تخزين كائن الإدخال في شكل قائمة مرتبطة. يتم استخدام كائن الإدخال الحالي كعقدة التالية لكائن الإدخال الذي تم تخزينه.
ماذا لو أنقذنا المفتاح الحالي في قيمة أخرى؟ منطقيا ، سيتم استبدال القيمة القديمة. بعد اكتشاف موضع التخزين لكائن الإدخال ، ستجتاز HASHMAP القائمة المرتبطة بالإدخال في هذا الموضع. إذا وجدت أن طريقة متساوية متساوية ، يتم إجراء الاستبدال.
وبهذه الطريقة ، يمكن لـ HashMap ضمان تفرد المفتاح.
آلية عمل طريقة الحصول
لقد تعلمنا الآن آلية التخزين التي تم وضعها في هاشماب. والسؤال التالي هو: كيفية الاستعلام عن نتائج hashmap.
في الواقع ، فإن المنطق هو نفس المنطق.
/*** إرجاع القيمة التي يتم تعيين مفتاح تحديد ،* أو {code null} إذا كانت هذه الخريطة تحتوي على خرائط للمفتاح. * {code k} إلى قيمة {code v} بحيث {code (key == null؟ k == null:* key.equals (k)} ، ثم تُرجع هذه الطريقة {code v} ؛ o theerwise* يعود {code null}. تستخدم لتمييز حالتين. )) ؛ = مفتاح
يبدو الرمز أعلاه مشابهًا لطريقة put () ، باستثناء if (
انتبه