يوفر API Collection API Java بعض فصول الأعمدة والواجهات لمساعدتنا في تخزين وإدارة مجموعات الكائنات. في الواقع ، تعمل المجموعات في Java مثل مجموعة ، ولكن يمكن تغيير حجم المجموعة ديناميكيًا ، كما توفر المجموعات وظائف أكثر تقدماً. مع API Javacollection ، لسنا بحاجة إلى كتابة دروس التجميع بأنفسنا. توجد معظم فئات مجموعة Java في حزمة java.util ، وتقع بعض فصول التجميع المتعلقة بالتزامن في حزمة java.util.concurrent . فيما يلي بعض فئات التجميع التي توفرها Java API.
1. نظرة عامة على مجموعات جافا
هناك فئتان من المجموعات في جافا ، وهما:
1. المجموعة
2. خريطة
يمكن فهم مجموعة فئة التجميع على أنها تخزين كائنات مفردة بشكل أساسي ، في حين أن مجموعة فئة MAP تخزن بشكل أساسي كائنات القيمة الرئيسية. يمكن اعتبار هاتين الفئتين أمرا مفروغ منهما يتوافقان مع واجهتين ، وهما Collection接口Map接口. تسرد الصورة التالية شجرة الميراث لهاتين الواجهتين:
من الصورة أعلاه ، يمكننا أن نرى أن واجهة التجميع قد اشتقت ثلاثة فروع ، وهي:
1. قائمة
2. مجموعة
3. قائمة الانتظار
الخريطة بسيطة نسبيا ، مع فرع واحد فقط. أدناه سنقدم كل فئة تنفيذ من مجموعة Java بالتفصيل.
ملاحظة: لتمييز التجميع والمجموعات ، تعد المجموعات واجهة للمجموعة ، والمجموعات هي فئة أدوات ، والتي توفر بعض الطرق الثابتة لتسهيل تشغيل مثيلات التجميع ، وكلاهما يقع في حزمة java.util .
2. أول مقدمة من واجهة التجميع
الشكل التالي هو لقطة شاشة للرمز المصدري لواجهة المجموعة. من الأساليب المجردة في الواجهة ، يمكننا أن نرى أنه يحدد طريقة شائعة لمجموعة عامة:
- إضافة وحذف عنصر
- تحديد ما إذا كان العنصر موجودًا
- احصل على حجم المجموعة
- تكرار على مجموعة
2.1 واجهة قائمة المجموعة
ترث واجهة القائمة من واجهة التجميع. خاصتها هي أن الكائنات الموجودة فيه مرتبة وأن كل كائن لديه فهرس فريد. يمكننا البحث عن عنصر من خلال هذا الفهرس ، ويُسمح بتكرار الكائنات الموجودة في القائمة ، وهو ما يشبه صفيف. لواجهة القائمة ، توفر Java API التنفيذ التالي:
- java.util.arraylist
- Java.Util.LinkedList
- Java.Util.vector
- java.util.stack
بالطبع ، هناك بعض التطبيقات في حزمة java.util.concurrent ، والتي سيتم وصفها بالتفصيل في مقال آخر.
ArrayList هي المجموعة الأكثر استخدامًا ، وتنفيذها الداخلي عبارة عن صفيف ، ويمكن توسيع حجم قائمة ArrayList ديناميكيًا. كفاءة الوصول العشوائية للعناصر عالية ، والتعقيد الزمني للوصول هو O(1) . كفاءة التشغيل من الذيل مرتفع ، وتعقيد الوقت هو O(1) تمامًا مثل الوصول العشوائي. إذا تم تشغيله من الرأس ، فستكون الكفاءة منخفضة نسبيًا ، لأنه عند الإدراج أو الحذف من الرأس ، يجب نقل جميع العناصر التالية ، والتعقيد الزمني هو O(ni) (N يمثل عدد العناصر ، ويمثل موضع العنصر).
LinkList: كما يتضح من الشكل أعلاه ، فإنه لا يرث واجهة List فحسب ، بل يرث أيضًا الواجهة Deque (سيتم تقديمه لاحقًا). LinkList هي بنية بيانات تستند إلى قائمة مرتبطة ، وتوفر كل عقدة المؤشرات للعقد السابقة والحالة التالية. LinkList غير فعال نسبيًا للوصول العشوائي لأنه يتطلب الفهرسة من نقطة الصفر ، وبالتالي فإن تعقيد الوقت هو O(i) . ومع ذلك ، بالنسبة لإضافة العناصر وحذفها ، فإن LinkList فعال لأن المؤشرات الأمامية والخلفية فقط تحتاج إلى تعديل ، وتعقيدها الزمني هو O(1) .
المتجه: من لقطات الشاشة الخاصة برمز المصدر المتجه و ArrayList ، يرثون الواجهات كما هي بالضبط. لذلك ، يمكن اعتبار المتجه عبارة عن قائمة آمنة آمنة مؤشرات ترابط ، والتي يتم تنفيذها أيضًا على أساس المصفوفات ، ولكن يتم إضافة جميع عمليات التجميع تقريبًا مع الكلمة الرئيسية synchronized .
المكدس: ما سبق هو لقطة شاشة لرمز مصدر فئة المكدس. نرى أن فئة المكدس ترث بالفعل من المتجه. يضيف Stack فقط عدة طرق بناءً على المتجه لتوفير خصائص المكدس (Last in First Out Lifo). ميزة Stack هي أنه عند إضافتها ، ستتم إضافة عناصر جديدة إلى الأعلى ، وعند إزالتها ، ستتم إزالة العناصر العليا أولاً. يستخدم بنية البيانات هذه بشكل أساسي كبعض عمليات معالجة البيانات الخاصة ، مثل تجميع اللغة ، تحليل XML ، إلخ.
2.2 واجهة مجموعة المجموعة
وترث واجهات تعيين وقائمة أيضًا من واجهة Collection ، وهي أيضًا تنفيذ مجموعات. الفرق الأكبر بينهما هو أنه لا يُسمح بتكرار الكائنات في المجموعة . بالنسبة للواجهات Set ، يوفر Java API التنفيذ التالي:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- java.util.treeset
تختلف وظائف هذه الفئات قليلاً ، وينعكس الاختلافات بشكل أساسي في ترتيب تكرار الكائنات وكفاءة الإدراج والبحث.
تطبيق Hashset بسيط للغاية ، وهو عبارة عن HashMap في الداخل ، لكنه لا يضمن ترتيب العناصر.
إن تنفيذ LinkedHashSet بسيط للغاية ، ويستخدم LinkedHashMap داخليًا. نظرًا لأن LinkedHashMap تحافظ على قائمة مرتبطة ثنائية الاتجاه داخليًا للحفاظ على الطلب ، فإن خاصية LinkedHashSet هي أن العناصر الموجودة فيه يتم طلبها ، وترتيب تكرار العناصر هو ترتيب إدخالها. لن تؤثر إعادة إدخال العناصر على ترتيب العناصر الأصلية.
Treeset: من علاقة الميراث في الشكل أعلاه ، يجب أولاً فهم واجهات NavigableSet TreeSet SortedSet .
واجهة SortedSet
الواجهة العامة sortedset <e> يمتد SET <e> {المقارنة <؟ super e> المقارنة () ؛ sortedset <e> subet set (e fromelement ، e toElement) ؛ sortedset <e> سماعة الرأس (e toElement) ؛ sortedset <e> tailset (e fromelement) ؛ e أولاً () ؛ } من تعريف الواجهة أعلاه ، واجهة SortedSet هي واجهة فرعية للمجموعة. بالإضافة إلى خصائص المجموعة العامة ، يتم طلب عناصرها داخليًا. يعتمد ترتيب العناصر الداخلية على قواعد الطلب للعناصر ، أي ترتيب العناصر يعتمد على تنفيذ الواجهة comparable للعنصر أو comparator المقارنة. للحصول على الفرق بين المقارنة والمقارنة ، يرجى الرجوع إلى: https://www.vevb.com/article/93973.htm
Incipigableset Interface
الواجهة العامة Navigableset <e> يمتد sortedset <e> {navigableset <e> descendingset () ؛ iterator <e> descenderiTerator () ؛ sortedset <e> سماعة الرأس (e toElement) ؛ sortedset <e> tailset (e fromelement) ؛ sortedset <e> subet set (e fromelement ، e toElement) ؛ السقف () ، الأرضية () ، أعلى () ، و lower () ...}من تعريف واجهة Navigableset ، هو واجهة فرعية من SortedSet وتوفر بعض طرق التنقل. أما بالنسبة لمعنى طرق التنقل هذه ، يمكنك التحقق من Java Doc.
لذلك ، فإن خاصية Treeset هي أن عناصرها الداخلية يتم طلبها وهناك العديد من أساليب التنقل للتنفيذ. من الجزء الأول من نظرة عامة على فئة مجموعة Java ، نعلم أن Set يحتوي على SortedSet الواجهة الفرعية ، وأن SortedSet يحتوي على واجهة NavigableSet من الواجهة الفرعية. يقوم Java API بتنفيذ واجهات SortedSet و Navigableset فقط ، وهي TreeSet .
2.3 واجهة قائمة انتظار المجموعة
ترث واجهة قائمة الانتظار من واجهة Collection ، والتي تمثل أيضًا قائمة انتظار مرتبة. ومع ذلك ، فإن أكبر ميزة في قائمة الانتظار هذه هي أن العنصر الذي تم إدراجه حديثًا يقع في ذيل قائمة الانتظار ويقع الكائن الذي تمت إزالته على رأس قائمة الانتظار ، وهو ما يشبه قائمة الانتظار التي تتحقق في السوبر ماركت.
نحن نعرف بالفعل من نظرة عامة على مجموعة Java في القسم 1 أن واجهة قائمة الانتظار تحتوي أيضًا على واجهة فرعية. دعونا نلقي نظرة على تعريف هاتين الواجهتين من قبل Java API:
واجهة قائمة الانتظار:
قائمة انتظار الواجهة العامة <e> تمتد المجموعة <e> {boolean add (e e) ؛ عرض منطقي (e e) ؛ e إزالة () ؛ E Poll () ؛ E PEEK () ؛}واجهة deque:
الواجهة العامة deque <e> تمتد قائمة الانتظار <e> {void addFirst (e e) ؛ addlast void (e e) ؛ e removeFirst () ؛ e removeFirst () ؛}من تعريفات هاتين الواجهتين ، أعتقد أن الجميع قد شاهدوا بعض القرائن. تحدد واجهة قائمة الانتظار طريقة تشغيل قائمة انتظار عامة ، في حين أن Deque عبارة عن قائمة انتظار مزدوجة .
لواجهات Queue ، توفر Java API تطبيقين:
- Java.Util.LinkedList (يقوم أيضًا بتنفيذ الواجهة deque)
- java.util.priorityqueue
LinkedList: ذكر الفصل القائم السابق أنه قائمة انتظار قياسية.
PriorityQueue: يشبه الترتيب في قائمة الانتظار Treeset ، اعتمادًا على قواعد الطلب للعناصر ، أي تنفيذ العناصر بالواجهة المماثلة أو مقارنة المقارنة.
بالنسبة للواجهة deque ، هناك تطبيق آخر إلى جانب فئة LinkList:
- java.util.arraydeque
Arraydeque: كما يتضح من الاسم ، فإن تطبيقه الداخلي هو صفيف.
3. خريطة مجموعة جافا
من الجزء الأول من نظرة عامة على فئة مجموعة Java ، نعلم أن الخريطة لا ترث من واجهة التجميع ، ولكنها تقع في وضع مواز مع واجهة التجميع. لذلك ، يختلف سلوك الخريطة تمامًا عن سلوك التجميع الذي تم تقديمه أعلاه. الميزة الرئيسية للخريطة هي أن العناصر التي تخزنها هي أزواج key-value . لنلقي نظرة على تعريف واجهة الخريطة:
خريطة الواجهة العامة <k ، v> {v put (k key ، v value) ؛ يحتوي Boolean على Keykey (مفتاح الكائن) ؛ SET <map.entry <k ، v >> enterSet () ؛ int hashcode () ؛ v get (مفتاح الكائن) ؛ تعيين <k> keyset () ؛ ...}لواجهات الخريطة ، توفر Java API التطبيقات التالية:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.identityhashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
من بينها ، الأكثر شيوعا هو hashmap و treemap.
المفتاح والقيمة في hashmap كلاهما مضطربين. التنفيذ الداخلي لـ HashMap يستحق الدراسة. لمزيد من التفاصيل ، يرجى الرجوع إلى التنفيذ الداخلي لـ HashMap
يمكن اعتبار علامة التجزئة بمثابة تنفيذ للوزن الثقيل لـ HashMap. تتم إضافة معظم الطرق مع الكلمة الرئيسية المتزامنة ، والتي هي آمنة مؤشرات الترابط. هناك اختلاف آخر بين HashTable و HashMap هو أنه يُسمح لكلا من key-value كل من HashMap بأن تكون فارغة ، في حين HashTable不.
LinkedHashMap هي أيضًا hashmap ، ولكن يتم الحفاظ على قائمة مرتبطة ثنائية الاتجاه داخليًا للحفاظ على الطلب. يتم استخدام التنفيذ الداخلي LinkedHashSet لاستخدام LinkedHashMap.
لا يمكن للمفتاح والقيمة في Treemap الحفاظ على الترتيب فحسب ، بل يشبهان TreeSet و PriorityQueue . يعتمد الترتيب التكراري للمفتاح والقيمة في Treemap على قواعد الفرز الخاصة بكل منها.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.