JDK1.8.0_144 عنوان التنزيل: //www.vevb.com/softs/551512.html
تقوم AbstractMap Class بتجميع بعض الأساليب البسيطة والعامة ، والتي ليست صعبة في حد ذاتها. ولكن هناك طريقتان في هذه الفئة المجردة تستحق الاهتمام بها. يمكن القول إن تنفيذ رمز مصدر طريقة المفاتيح والقيم نماذج على غرار الكتب المدرسية.
عادةً ما يتم تنفيذ فئات التجريد كهيكل عظمي لتنفيذ طرق مشتركة للفئات الفرعية الخاصة بها. في المقالة السابقة ، شرحنا واجهة الخريطة ، وتحليل هذه المقالة ودراسات الفئة الملخص التجريدي.
هناك الكثير من هياكل بيانات نوع الخريطة في Java. يقوم AbstractMap ، حيث ينفذ هيكل عظمي ، بعض طرق واجهة الخريطة ، أي أنه يوفر أساليب عامة لفئاته الفرعية ، وقد تكون الخريطة المختلفة بدون تنفيذ مختلفة.
لا يمكن للفئة المجردة إنشاء مثيلات فصول مجردة مباشرة من خلال الكلمة الرئيسية الجديدة ، ولكن يمكن أن تحتوي على مُنشئين. يوفر AbstractMAP مُنشئًا محميًا بدون معلمات ، مما يعني أن الفئة الفرعية فقط يمكنها الوصول (بالطبع إنها فئة مجردة نفسها ، ولا يمكن إنشاء فئات أخرى مباشرة) ، أي فقط يمكن أن يطلق الفئة الفرعية على هذا المُنشئ بدون المعلمة.
يتم تعريف واجهة الدخول داخليًا في واجهة الخريطة. هذه الواجهة عبارة عن تطبيق داخلي لخريطة الخريطة للحفاظ على زوج قيمة المفتاح الرئيسي ، ويتم تخزين قيمة المفتاح في هذه الخريطة. يقوم AbstractMap بتنفيذ هذه الواجهة الداخلية ، هناك نوعان في المجموع: أحدهما هو البسيط القابل للتغيير والآخر هو SimpleMutableentry غير القابل للتغيير.
الطبقة الثابتة العامة البسيطة <k ، v> تنفذ الإدخال <k ، v> ، java.io.serializable
يتم تنفيذ واجهة الخريطة.
طريقتها بسيطة نسبيا ، وكلها عمليات أخذ القيم وتخزين القيم. تعريف القيمة الرئيسية هو تعديل نهائي ، مما يعني أنه مرجع غير قابل للتغيير. بالإضافة إلى ذلك ، فإن طريقة setValue الخاصة بها خاصة بعض الشيء. القيمة المخزنة ليست هي القيمة المخزنة ، ولكن القيمة القديمة التي تم إرجاعها. ما تحتاج إلى تعلمه هو أساليب المساواة والبدودة التي يعيدها إعادة كتابة.
منطقية عامة تساوي (كائن O) {if (! (o مثيل من الخريطة. Entry)) // لتحديد ما إذا كانت المعلمات من map.entry نوع ، إذا كانت المساواة متساوية ، فإن أول ما يجب فعله هو أن تكون نفس النوع عودة خاطئة ؛ map.entry <؟ ،؟> e = (map.entry <؟ ،؟>) o ؛ // إجبار نوع الكائن على map.entry type ، تستخدم المعلمة "؟" بدلاً من "K ، V" لأنه سيتم محو نوع العام في وقت التشغيل. لا يعرف المترجم النوع K و V ، إرجاع Eq (Key ، E.GetKey ()) && eq (value ، e.getValue ()) ؛ // المفتاح والقيمة استدعاء طريقة EQ للحكم على التوالي ، ومساواة متساوية عندما يكون كل من الإرجاع. } eq static boolean eq (الكائن O1 ، كائن O2) {return o1 == null؟ O2 == null: O1.equals (O2) ؛ // هذا المشغل المكون من ثلاثة عناصر بسيطة للغاية ، ولكن تجدر الإشارة إلى أنه على الرغم من أن O1 و O2 من أنواع الكائنات هنا ، إلا أن طريقة متساوية في نوع الكائن يشار إليها بـ "==" ، لذلك لا تعتقد أن هناك مشكلة هنا ، لأنه في الواقع ، قد يكون نوع O1 سلسلة ، على الرغم من أنه يتم تحويله إلى كائن ، لذلك لا تزال السلسلة#تساوي طريقة استدعاء طريقة المتساوية. }لإعادة كتابة طريقة متساوية بشكل صحيح واستخدامها بشكل صحيح ، عادة ما تحتاج إلى إعادة كتابة طريقة Hashcode.
public int hashcode () {return (key == null؟ 0: key.hashCode ()) ^ (value == null؟ 0: value.hashCode ()) ؛ // عندما لا تكون قيم المفتاح والقيمة لاغية ، فسيتم xhored hashcode. }الطبقة الثابتة العامة SimpleImmutableentry <k ، v> تنفذ الإدخال <K ، V> ، Java.io.serializable SimpleMutableentry
يُعرف الإدخال بأنه غير قابل للتغيير في الواقع لأنه لا يوفر طريقة setValue ، وبطبيعة الحال لا يمكن تعديلها من خلال طريقة setValue عند الوصول إلى مؤشرات ترابط متعددة في وقت واحد. بالمقارنة مع Simpleentry ، يتم تعريف متغيرات أعضاء المفتاح والقيمة على أنها الأنواع النهائية. إن استدعاء طريقة setValue سوف يرمي استثناء غير مدعوم.
تتوافق أساليبها المتساوية وتجزئة الرمز مع البسيط.
بعد ذلك ، تحقق من الأساليب الموجودة في واجهة الخريطة التي يتم تنفيذها بواسطة فئة AbstractMap Abstract.
حجم int العام ()
يتم تعريف طريقة الإدخال في الخريطة ، والتي تُرجع مجموعة مجموعة الخريطة. تسمى طريقة حجم مجموعة المجموعة مباشرة ، وهو حجم الخريطة.
منطقية عامة isempty ()
استدعاء طريقة الحجم أعلاه ، يساوي 0 ، فهي فارغة.
يحتوي المنطق العام على مفتاح الكائنات (مفتاح الكائن)
تطبيق هذه الطريقة بسيط نسبيا. من خلال استدعاء طريقة الإدخال ، يتم الحصول على ITerator of SET Collection وتجاوزها باستخدام مفتاح المعلمة. يمكن تخزين الخريطة كقيمة مفتاح Null. نظرًا لأن Key = null يتم تخزينها في MAP مع تخزين خاص خاص (لا يمكن حساب قيمة HashCode) ، فقد قمنا أيضًا بعمل طريقة لتحديد ما إذا كان مفتاح المعلمة فارغًا.
يحتوي المنطق العام على القيمة (قيمة الكائن)
تنفيذ الطريقة هذا يتسق مع ConteSkey.
Public V GET (مفتاح الكائن)
يشبه تنفيذ الطريقة هذا بينهما أعلاه ، والفرق هو أن ما سبق يساوي المنطق ، وهذه الطريقة تُرجع القيمة.
Public V PUT (K key ، v value)
لا يتم تنفيذ طريقة تخزين أزواج القيمة الرئيسية في الخريطة بالتفصيل ، وسيتم إلقاؤها مباشرة.
Public V إزالة (مفتاح الكائن)
احذف زوج قيمة المفتاح المفتاح المحدد في الخريطة عبر مفتاح المعلمة. هذه الطريقة بسيطة للغاية. كما أنه يعبر مجموعة SET من MAP.ENTRY من خلال جهاز التكرار ، ويجد قيمة المفتاح المقابلة ، ويحذف map.entry عن طريق استدعاء طريقة التكرار#إزالة.
public putall (الخريطة <؟ تمتد k ،؟ يمتد v> m)
هذه الطريقة بسيطة للغاية لاجتياز الخريطة الواردة واتصل فقط طريقة وضع لحفظها.
الفراغ العام واضح ()
استدعاء طريقة الإدخال للحصول على مجموعة SET ثم استدعاء طريقة SET#CELLE () لمسحها.
مجموعة عامة <k> keyset ()
إرجاع مجموعة مجموعة من قيم مفاتيح الخريطة. يعرّف AbstractMap متغير عضو "مجموعة عابرة <K> مفتاح". في JDK7 ، يتم تعديل متغير المفاتيح بواسطة متقلبة ، ولكن في JDK8 ، لا يتم تعديله بواسطة متطاير. يتم شرحه في التعليقات على متغير المفاتيح أن طريقة الوصول إلى هذه الحقول لا تتم مزامنتها بمفردها ، ولا يمكن أن تضمن سلامة الخيوط المتطايرة. تطبيق طريقة المفاتيح مثير للاهتمام.
بادئ ذي بدء ، فكر في هذه الطريقة هو إرجاع مجموعة القيم الرئيسية. وبطبيعة الحال ، يمكننا التفكير في طريقة تنفيذ بسيطة ، وتجاوز صفيف الإدخال واتخاذ القيمة الرئيسية ووضعها في المجموعة ، على غرار الكود التالي:
مجموعة عامة <k> keyset () {set <k> ks = null ؛ لـ (map.entry <k ، v> entry: intplsSet ()) {ks.Add (entry.getKey ()) ؛ } إرجاع KS ؛}هذا يعني أنه في كل مرة يتم فيها استدعاء طريقة المفاتيح ، فإنها تعبر صفيف الدخول ، وسيتم تقليل الكفاءة بشكل كبير عندما يكون حجم البيانات كبيرًا. يجب أن أقول إن رمز مصدر JDK مكتوبة جيدًا ، ولا يعتمد طريقة اجتياز. إذا لم تعبر الإدخال ، فكيف تعرف أن الخريطة أضافت زوجًا من قيمة المفاتيح الرئيسية في هذا الوقت؟
الجواب هو إعادة تنفيذ مجموعة مجموعة مخصصة جديدة داخل طريقة المفاتيح ، ويتم إعادة كتابة طريقة التكرار في هذه المجموعة المخصصة. هنا هو المفتاح. تقوم طريقة التكرار بإرجاع واجهة التكرار ، وهنا يتم إعادة تنفيذها. من خلال استدعاء طريقة الإدخال ثم استدعاء طريقة التكرار. يتم تحليل ما يلي بالاشتراك مع الكود:
مجموعة عامة <k> keyset () {set <k> ks = keyset ؛ . iterator <intrading <k ، v >> i = enterSet (). iterator () ؛ // إنشاء مجموعة مجموعة iterator iterator public boolean hasnext () {return i.hasnext () ؛ // حكم القيمة الرئيسية هو حكم الإدخال} k next () {return i.next (). // قيمة المفتاح التالي هي أخذ الإدخال#getKey} public void remove () {i.remove () ؛ // حذف قيمة المفتاح ، حذف الإدخال}} ؛ } size int public () {// مجموعة set#refritten#size returns ussstractmap.tis.size () ؛ // قيمة المفتاح هي حجم الخريطة بأكملها ، لذا فقط استدعاء طريقة حجم هذه الفئة. هذه فئة داخلية. استخدم هذه الكلمة الرئيسية لتمثيل هذه الفئة مباشرة. يجب أن يشير إلى أن طريقة الحجم في الخريطة الملخص. بدون هذا ، فهذا يعني أنها طريقة ثابتة ثابتة} isempty boolean العامة () {// مجموعة إعادة كتابتها#isempty تُرجع الملخصة. this.isempty () ؛ // لما إذا كانت هناك قيمة رئيسية ، فهذا يعني ما إذا كانت الخريطة فارغة ، لذلك فهي فقط تسميات isEmpty لهذا الفئة} public void clear () {// set refretten#clear method ustructionmap.tis.clear () ؛ // قم بمسح قيمة المفتاح ، فهي فقط لمسح الخريطة ، لذا فهي فقط استدعاء الطريقة الواضحة لهذه الفئة} يحتوي Boolean العام على (كائن K) {// set set#يحتوي على طريقة إرجاع AbstractMap.Tis.ContainsKey (K) ؛ // الحكم على ما إذا كان SET يحتوي على بيانات k ، مما يعني ما إذا كانت الخريطة تحتوي على قيمة مفتاح ، لذلك فقط استدعاء طريقة contekey في هذه الفئة}} ؛ KeySet = KS ؛ // قم بتعيين هذه المجموعة المخصصة لمفاتيح المتغير. عند استدعاء طريقة المفاتيح مرة أخرى في المستقبل ، لأن المفاتيح ليست فارغة ، تحتاج فقط إلى العودة مباشرة. } إرجاع KS ؛أعتقد أن هذا تطبيق ذكي للغاية. على الرغم من أن هذه الطريقة تدور حول القيمة الرئيسية ، إلا أنه يمكن تنفيذها بالفعل مع الدخول دون عبور الإدخال. في الوقت نفسه ، يذكر أعلاه أن استدعاء طريقة الإدخال# ايتراتور ، والتي هي أفضل الممارسات في وضع طريقة القالب. نظرًا لعدم تطبيق Entplset في AbstractMap ، ولكن يتم تركها إلى فئة الفئة الفرعية لإكمالها ، ولكن يمكن تنفيذ طريقة المفاتيح باستخدام "خوارزمية الهيكل العظمي" ، وهو نمط طريقة القالب.
المجموعة العامة <v> القيم ()
بالنسبة لطريقة القيم ، يمكنك الرجوع إلى KeySet تمامًا. الاثنان لهما نفس التأثير ، لذلك لن أكرره هنا لتوفير المساحة.
مجموعة مجردة عامة <الإدخال <K ، V >> EntplsSet ()
يتم تسليم طريقة مجردة إلى فئة الفرعية لإكمالها ، مما يشير إلى أن هذه الطريقة ليست "عامة" بشكل خاص.
منطقية عامة متساوية (كائن O)
تنص الخريطة على أنه فقط عندما يتوافق المفتاح وقيمة كل زوج من قيمة المفاتيح في الخريطة واحدة تلو الأخرى. في هذه الطريقة ، تحكم أولاً على الشروط البسيطة. إذا كانت المراجع متساوية ، فأعد صواب مباشرة. إذا كانت المعلمة O ليست من نوع الخريطة ، فأرجع كاذبة مباشرة. إذا كان عدد الخريجين مختلفًا ، فأرجع كاذبة مباشرة. عندها فقط سوف يتكرر على صفيف الإدخال ومقارنة ما إذا كان المفتاح والقيمة في الإدخال يتوافقان واحدًا تلو الآخر. الطريقة بسيطة ، ولكن هذا يعطينا مصدر إلهام. في الحكم المشروط ، يجب أن نحكم أولاً على الأساسيات البسيطة ، ثم نحكم على المعقدين.
Hashcode int العام ()
أعد كتابة طريقة متساوية في فئة الكائن ، وإعادة كتابة رمز Hashcode ضروري أيضًا. تتمثل تنفيذ HashCode في AbstractMap لإضافة قيم Hashcode لجميع MAP.ENTRY (فيما يلي SIMPLEENTRY أو SIMPLEMUTABLEENTRY) إلى النهاية ، ويستخدم المبلغ النهائي كقيمة HASHCODE للخريطة.
السلسلة العامة tostring ()
لا يوجد شيء يمكن قوله حول هذه الطريقة ، فهو إخراج جميع أزواج القيمة الرئيسية واستخدام StringBuilder لصقها.
استنساخ الكائن المحمي () يلقي clonenotsupportedException
قم بتنفيذ نسخة ضحلة ، لأنها نسخة ضحلة من المفاتيح والقيم المتغيرة ، مما يمنع المشكلات الناجمة عن النسختين الضحلة.