إطار عمل مجموعات جافا

مخطط هرمي للفئات والواجهات في إطار عمل مجموعات جافا
هيكل فئات وواجهات إطار عمل مجموعات جافا، باستثناء الأنواع الموجودة في حزمة java.util.concurrent وبعض الفئات الأخرى

إطار عمل مجموعات جافا هو مجموعة من الفئات والواجهات التي تنفذ هياكل بيانات المجموعات القابلة لإعادة الاستخدام بشكل شائع ( المجموعات ). [ 1 ]

على الرغم من الإشارة إليه كإطار عمل ، إلا أنه يعمل بطريقة تشبه المكتبة . يوفر إطار عمل المجموعات واجهات تُعرّف مجموعات متنوعة، بالإضافة إلى فئات تُنفّذها.

الاختلافات عن المصفوفات

Collectionتتشابه السلاسل النصية والمصفوفات في كونهما تحتويان على مراجع للكائنات ويمكن إدارتهما كمجموعة. مع ذلك، وعلى عكس المصفوفات، Collectionلا تحتاج السلاسل النصية إلى تحديد سعة معينة عند إنشائها. Collectionإذ يمكن أن يزداد حجمها أو ينقص تلقائيًا عند إضافة الكائنات أو إزالتها.

Collectionلا يمكن لـ s أن تحتوي على أنواع البيانات الأولية مثل int، longأو ، أو double. [ 2 ] بدلاً من ذلك، Collectionيمكن لـ s أن تحتوي على فئات تغليف مثل java.lang.Integer، java.lang.Longأو ، أو java.lang.Double. [ 3 ]

Collectionالكائنات العامة، مثل `<a>`، عامة وبالتالي ثابتة، بينما المصفوفات متغيرة . يمكن اعتبار هذا ميزة للكائنات العامة مقارنةً Collectionبالمصفوفات، لأنه في بعض الحالات، Collectionيمنع استخدام الكائن العام بدلاً من المصفوفة حدوث استثناءات وقت التشغيل، وذلك عن طريق طرح استثناء وقت الترجمة لإبلاغ المطور بتصحيح الكود. على سبيل المثال، إذا قام المطور بتعريف كائن `<a>` Object[]، ثم أسند Object[]إليه القيمة المُعادة من Long[]نسخة جديدة بسعة معينة، فلن يتم طرح أي استثناء وقت الترجمة. إذا حاول المطور إضافة قيمة Stringإلى هذا Long[]الكائن، فسيطرح برنامج جافا استثناءً ArrayStoreException. من ناحية أخرى، إذا قام المطور بتعريف نسخة جديدة من ` Collection<Object><a>` كـ ArrayList<Long>`<a>`، فسيطرح مُترجم جافا (بشكل صحيح) استثناء وقت الترجمة للإشارة إلى أن الكود مكتوب بنوع غير متوافق وغير صحيح، وبالتالي يمنع أي استثناءات محتملة وقت التشغيل. يمكن للمطور تصحيح الكود عن طريق إنشاء نسخة من `<a>` ككائن `<a>` . إذا كان الكود يستخدم Collection<Object>Java ArrayList<Object>SE7 أو إصدارات أحدث، فيمكن للمطور إنشاء نسخة Collection<Object>من `<a>` ArrayList<>ككائن `<a>` باستخدام عامل التشغيل الماسي [ 2 ] .

Collection[ 2 ] تُعتبر s عامة وبالتالي يتم تجسيدها ، لكن المصفوفات لا يتم تجسيدها.

تاريخ

تضمنت تطبيقات المجموعات في إصدارات منصة جافا السابقة لـ JDK 1.2 عددًا قليلًا من فئات هياكل البيانات، لكنها لم تتضمن إطار عمل للمجموعات. [ 4 ] كانت الطرق القياسية لتجميع كائنات جافا تتم عبر المصفوفة، Vectorو، Hashtableوفئات، والتي لم يكن من السهل توسيعها، ولم تُطبّق واجهة أعضاء قياسية. [ 5 ]

لتلبية الحاجة إلى هياكل بيانات مجموعات قابلة لإعادة الاستخدام ، تم تطوير العديد من الأطر المستقلة، [ 4 ] وكان أكثرها استخدامًا حزمة Collections الخاصة بدوغ ليا ، [ 6 ] ومكتبة ObjectSpace Generic Collection Library (JGL)، [ 7 ] والتي كان هدفها الرئيسي هو التوافق مع مكتبة القوالب القياسية للغة C++ (STL). [ 8 ]

صُمم إطار عمل المجموعات وطُوّر بشكل أساسي بواسطة جوشوا بلوخ ، وقُدّم في JDK 1.2 . وقد أعاد استخدام العديد من الأفكار والفئات من حزمة Collections الخاصة بدوغ ليا ، والتي تم إيقاف دعمها نتيجة لذلك. [ 6 ] اختارت شركة صن مايكروسيستمز عدم استخدام أفكار JGL، لأنها أرادت إطار عمل مُدمجًا، ولم يكن التوافق مع لغة C++ من أهدافها. [ 9 ]

قام دوغ ليا لاحقًا بتطوير حزمة للتزامن ، تتضمن فئات جديدة متعلقة بالمجموعات. [ 10 ] تم تضمين نسخة محدثة من أدوات التزامن هذه في JDK 5.0 اعتبارًا من JSR 166 .

بنيان

معظم المجموعات في جافا التي ليست خرائط مشتقة من java.util.Collectionالواجهة. Collectionتحدد هذه الواجهة الأجزاء الأساسية لجميع المجموعات.

تحتوي الواجهة على add(E e)طريقتين remove(E e)لإضافة عناصر إلى قائمة وحذف عناصر منها Collectionعلى التوالي. كما تحتوي على toArray()طريقة لتحويل القائمة Collectionإلى مصفوفة من Objectعناصر في القائمة Collection(مع نوع إرجاع Object[]). [ 11 ] وأخيرًا، contains(E e)تتحقق الطريقة مما إذا كان عنصر محدد موجودًا في القائمة Collection.

الواجهة Collectionهي واجهة فرعية من java.lang.Iterable، لذا Collectionيمكن أن يكون أي منها هدفًا لعبارة for-each . ( Iterableتوفر الواجهة iterator()الطريقة المستخدمة في عبارات for-each). جميع Collections تُنفذ java.util.Iteratorلمسح جميع العناصر في Collection.

Collectionهو عام. Collectionيمكن لأي كائن تخزين أي نوع Object. على سبيل المثال، أي تطبيق لـ Collection<String>يحتوي على Stringكائنات. لا يلزم إجراء تحويل نوع عند استخدام Stringالكائنات من تطبيق لـ Collection<String>. [ 12 ] لاحظ أن الأقواس الزاوية < >يمكن أن تحتوي على وسيط نوع يحدد نوع Collectionالكائن. [ 13 ]

إطار عمل المجموعة

يحتوي إطار عمل المجموعة على جميع المجموعات (المفهوم العام) مثل القوائم وما إلى ذلك، والتي تتبع واجهة المجموعة.

أنواع المجموعات

توجد عدة أنواع من المجموعات: الطوابير ، والخرائط ، والقوائم ، والمجموعات .

تتيح قوائم الانتظار للمبرمج إدخال العناصر بترتيب معين واسترجاعها بنفس الترتيب. ومن الأمثلة على ذلك قائمة الانتظار. وتُسمى الواجهات الأساسية لقوائم الانتظار بـ Queue...

تخزن القواميس/الخرائط مراجع للكائنات باستخدام مفتاح بحث للوصول إلى قيم الكائن. ومن أمثلة المفاتيح بطاقة الهوية. وتُسمى الواجهة الأساسية للقواميس/الخرائط بـ Map...

القوائم عبارة عن مجموعات محدودة حيث يمكنها تخزين نفس القيمة عدة مرات.

المجموعات هي مجموعات غير مرتبة يمكن تكرارها وتحتوي على كل عنصر مرة واحدة على الأكثر. تسمى الواجهة الأساسية للمجموعات Set. [ 3 ]

واجهة القائمة

تُطبَّق القوائم في إطار عمل المجموعات عبر java.util.Listواجهة برمجة التطبيقات. تُعرِّف هذه الواجهة القائمة بأنها نسخة أكثر مرونة من المصفوفة. للعناصر ترتيب مُحدَّد، ويُسمح بتكرار العناصر. يمكن وضع العناصر في مواقع مُحدَّدة، كما يُمكن البحث عنها داخل القائمة.

تطبيقات القوائم

هناك العديد من الفئات الملموسة التي تنفذ List، بما في ذلك وجميع فئاتها الفرعية المقابلة، بالإضافة إلى .AbstractListCopyOnWriteArrayList

فئة القائمة المجردة

تشمل الفئات الفرعية المباشرة للفئة ، و .AbstractListAbstractSequentialListArrayListVector

AbstractListيُعد مثالاً على التنفيذ الهيكلي ، الذي يستفيد من مزايا الواجهات والفئات المجردة ويجمع بينها، مما يسهل على المطور تطوير تنفيذه الخاص للواجهة المعطاة. [ 14 ]

فئة ArrayList

java.util.ArrayListتُنفذ الفئة ذلك على Listشكل مصفوفة. وعندما Listتكون هناك حاجة إلى وظائف خاصة بـ، تقوم الفئة بنقل العناصر داخل المصفوفة من أجل القيام بذلك.

فئة القائمة المرتبطة

يخزن هذا java.util.LinkedListالصنف العناصر في عقد، لكل منها مؤشر إلى العقدة السابقة واللاحقة في الجدول List. Listويمكن اجتياز الجدول باتباع هذه المؤشرات، كما يمكن إضافة العناصر أو إزالتها ببساطة عن طريق تغيير ترتيب المؤشرات لوضع العقدة في مكانها الصحيح. [ 15 ]

فئة المتجهات

تحتوي هذه الفئة على فئة فرعية مباشرة. يُعد هذا مثالًا على انتهاك مبدأ التركيب بدلًا من الوراثة في مكتبات منصة جافا، حيث أن المتجه في علوم الحاسوب ليس مكدسًا بشكل عام . [ 16 ] كان من الأنسب استخدام التركيب في هذه الحالة. [ 16 ]VectorStack

فئة المكدس

فئة تحتوي على خمس عمليات تسمح بالتعامل مع كائن ما كـ . يتم إنشاء المكدسات باستخدام . توفر هذه الفئة طرقًا لوضع كائن جديد على المكدس (الطريقة ) وللحصول على كائنات منه (الطريقة ). تُرجع هذه الفئة الكائن وفقًا لقاعدة " آخر ما يدخل أول ما يخرج" (LIFO)، أي أن الكائن الذي تم وضعه مؤخرًا على المكدس يُعاد أولًا. هي تطبيق قياسي للمكدس توفره لغة جافا.Stackextendsjava.util.VectorVectorStackjava.util.StackStackStackpush(E e)Stackpop()StackStackjava.util.Stack

يمثل هذا Stackالصنف مكدسًا من الكائنات يعمل وفق مبدأ "آخر ما يدخل أول ما يخرج" (LIFO). يحتوي صنف المكدس على خمس عمليات إضافية تسمح Vectorبالتعامل معه كمكدس . تُوفر العمليات Stackالمعتادة ، بالإضافة إلى دالة ( ) لمعاينة العنصر العلوي في المكدس ، ودالة ( ) لاختبار ما إذا كان المكدس فارغًا ، ودالة ( ) للبحث عن عنصر في المكدس ومعرفة بُعده عن العنصر العلوي . عند إنشاء مكدس لأول مرة، يكون فارغًا.push(E e)pop()peek()StackStackempty()Stacksearch(Object o)Stack

فئة CopyOnWriteArrayList

تُوسّع CopyOnWriteArrayListهذه Objectالفئة، ولا تُوسّع أي فئات أخرى. CopyOnWriteArrayListوهذا يسمح بأمان الخيوط دون إجراء تزامن مفرط. [ 17 ]

CopyOnWriteArrayListفي بعض الحالات، يكون التزامن إلزاميًا. على سبيل المثال، إذا قام أحد الأساليب بتعديل حقل ثابت، وكان يجب استدعاء هذا الأسلوب بواسطة عدة سلاسل عمليات، فإن التزامن يكون إلزاميًا، ولا ينبغي استخدام أدوات التزامن مثل [ 17 ] .

مع ذلك، قد يؤدي التزامن إلى زيادة في الأداء. في الحالات التي لا يكون فيها التزامن إلزاميًا، CopyOnWriteArrayListيُعدّ هذا بديلاً عمليًا وآمنًا للتزامن، يستفيد من المعالجات متعددة النوى ويؤدي إلى زيادة استخدام وحدة المعالجة المركزية . [ 17 ]

Queue interfaces

The java.util.Queue interface defines the queue data structure, which stores elements in the order in which they are inserted. New additions go to the end of the line, and elements are removed from the front. It creates a first-in first-out system. This interface is implemented by java.util.LinkedList, java.util.ArrayDeque, and java.util.PriorityQueue.

Queue implementations

AbstractQueue class

The direct subclasses of AbstractQueue class include ArrayBlockingQueue, ConcurrentLinkedQueue, DelayeQueue, LinkedBlockingDeque, LinkedBlockingQueue. LinkedTransferQueue and PriorityBlockingQueue.

Note that ArrayDeque and ConcurrentLinkedDeque both extend AbstractCollection but do not extend any other abstract classes such as AbstractQueue.

AbstractQueue is an example of a skeletal implementation.

PriorityQueue class

The java.util.PriorityQueue class implements java.util.Queue, but also alters it.[18]PriorityQueue has an additional comparator() method.[18] Instead of elements being ordered in the order in which they are inserted, they are ordered by priority. The method used to determine priority is either the java.lang.Comparable#compareTo(T) method in the elements, or a method given in the constructor. The class creates this by using a heap to keep the items sorted.[19]

ConcurrentLinkedQueue class

The java.util.concurrent.ConcurrentLinkedQueue class extends java.util.AbstractQueue. ConcurrentLinkedQueue implements the java.util.Queue interface.[20]

The ConcurrentLinkedQueue class is a thread-safe collection, since for any an element placed inside a ConcurrentLinkedQueue, the Java Collection Library guarantees that the element is safely published by allowing any thread to get the element from the collection.[21] An object is said to be safely published if the object's state is made visible to all other thread at the same point in time.[21] Safe publication usually requires synchronization of the publishing and consuming threads.[21]

BlockingQueue interface

The java.util.concurrent.BlockingQueue interface extends Queue.[20]

تحتوي الواجهة على الواجهات الفرعية المباشرة التالية: و . تعمل كواجهة عادية ، لكن إضافة عناصر إلى وحذف عناصر من تُعدّ عمليات حظر. [ 22 ] إذا تم استدعاء على قائمة فارغة ، فيمكن ضبطها للانتظار إما لفترة زمنية محددة أو إلى أجل غير مسمى حتى يظهر عنصر في . وبالمثل، تخضع إضافة عنصر باستخدام الطريقة لتقييد سعة اختياري على ، ويمكن للطريقة الانتظار حتى تتوفر مساحة في قبل الإرجاع. تُقدّم الواجهة طريقة تحذف وتحصل على رأس ، وتنتظر حتى لا تعود فارغة إذا لزم الأمر. [ 23 ] [ 24 ]BlockingQueueBlockingDequeTransferQueueBlockingQueueQueueBlockingQueueremove(Object o)BlockingQueueBlockingQueueadd(Object o)BlockingQueueBlockingQueueBlockingQueuetake()BlockingQueueBlockingQueue

واجهات قائمة الانتظار ذات الطرفين ( Deque )

تُوسّع هذه الواجهة الواجهة [ 25 ] ، وتُنشئ قائمة انتظار ثنائية الطرف. بينما تسمح قائمة الانتظار العادية بالإدراج في نهايتها والحذف من بدايتها فقط، تسمح هذه الواجهة بالإدراج أو الحذف من بدايتها ونهايتها. تُشبه هذه الواجهة قائمة انتظار عادية يُمكن استخدامها للأمام أو للخلف، أو كليهما معًا. بالإضافة إلى ذلك، يُمكن إنشاء مُكرِّر أمامي وآخر خلفي. تُنفَّذ هذه الواجهة بواسطة [ 26 ] .DequeQueueDequeQueueDequeDequeQueueDequejava.util.ArrayDequejava.util.LinkedList

تطبيقات Deque

فئة القائمة المرتبطة

LinkedListبالطبع، يقوم أيضًا بتنفيذ Listالواجهة ويمكن استخدامه كواحدة. ولكنه يحتوي أيضًا على الأساليب Queue. LinkedListيقوم بتنفيذ java.util.Dequeالواجهة، مما يمنحه مرونة أكبر. [ 27 ]

فئة ArrayDeque

ArrayDequeيُنفذ Queueكـ مصفوفة. على غرار LinkedList، ArrayDequeيُنفذ أيضًا الواجهة java.util.Deque. [ 27 ]

واجهة BlockingDeque

تُوسّع هذه java.util.concurrent.BlockingDequeالواجهة [ 25 ]java.util.concurrent.BlockingQueue ، وهي مشابهة لـ [28] . فهي تُوفّر نفس طرق الإضافة والحذف مع حدود زمنية للانتظار حتى تُصبح الإضافة أو الحذف ممكنة. ومع ذلك، تُوفّر هذه الواجهة أيضًا مرونة [ 28] . يُمكن إجراء عمليات الإضافة والحذف من كلا الطرفين. يتم دمج وظيفة الحظر مع الوظيفة [ 28 ] .BlockingDequeBlockingQueueDequeDeque

ضبط الواجهات

java.util.Setتُعرّف واجهة جافا Set. Setلا يمكن أن تحتوي على أي عناصر مكررة. بالإضافة إلى ذلك، Setليس لها ترتيب مُحدد. لذلك، لا يمكن العثور على العناصر باستخدام الفهرس. Setيتم تنفيذها بواسطة java.util.HashSet، java.util.LinkedHashSetو ، و java.util.TreeSet.

مجموعة تطبيقات الواجهة

هناك العديد من تطبيقات واجهة المجموعة، بما في ذلك فئاتها الفرعية، والفئة الداخلية الثابتة النهائية (حيث و هي معلمات النوع الرسمية).AbstractSetConcurrentHashMap.KeySetView<K,V>KV

مجموعة مجردة

AbstractSet[ 14 ] هو تطبيق هيكلي للواجهة .Set

تشمل الفئات الفرعية المباشرة لـ ، ، ، و .AbstractSetConcurrentSkipListSetCopyOnWriteArraySetEnumSetHashSetTreeSet

فئة EnumSet

يمتد هذا الصنف . لا يحتوي الصنف على دوال إنشاء عامة، ويحتوي فقط على دوال إنشاء ثابتة. [ 29 ]EnumSetAbstractSetEnumSet

EnumSetيحتوي على دالة المصنع الثابتة . [ 30 ] هذه الدالة هي دالة تجميع. [ 29 ] تأخذ عدة معلمات، وتراعي نوع هذه المعلمات، ثم تُرجع نسخة من النوع المناسب. [ 29 ] اعتبارًا من عام 2018، يستخدم تطبيق OpenJDK في Java SE8 تطبيقين غير مرئيين للعميل، وهما و . [ 29 ] إذا لم يعد يوفر أي تحسينات في الأداء لأنواع التعداد الصغيرة، فيمكن إزالته من المكتبة دون التأثير سلبًا على مكتبة مجموعات Java. [ 29 ]EnumSet.of()EnumSetRegularEnumSetJumboEnumSetRegularEnumSet

EnumSetيُعد بديلاً جيداً لحقول البتات ، وهو نوع من أنواع المجموعات، كما هو موضح أدناه. [ 30 ]

تقليديًا، عندما يواجه المطورون عناصر من نوع مُعدّد تحتاج إلى وضعها في مجموعة، فإنهم يستخدمون نمط int enum حيث يُخصص لكل ثابت قوة مختلفة للعدد 2. [ 30 ] يُمكّن هذا التمثيل الثنائي المطور من استخدام عملية OR الثنائية، بحيث يمكن دمج الثوابت في مجموعة، تُعرف أيضًا باسم حقل ثنائي . يُمكّن هذا التمثيل الثنائي المطور من إجراء عمليات فعالة على المجموعات وعمليات حسابية ثنائية مثل التقاطع والاتحاد. [ 30 ]

مع ذلك، توجد العديد من المشاكل في أسلوب تمثيل الحقول الثنائية . فالحقل الثنائي أقل قابلية للقراءة من ثابت تعداد من نوع عدد صحيح. [ 30 ] كذلك، إذا مُثِّلت العناصر بحقول ثنائية، يستحيل المرور على جميع هذه العناصر. [ 30 ]

يُعدّ استخدام نوع بيانات تعداد من نوع int بدلاً من حقل بتّ نهجًا بديلاً مُوصى به . [ 30 ] يستخدم هذا النهج نوع بيانات تعداد لتمثيل مجموعة القيم التي تنتمي إلى النوع نفسه. [ 30 ] ولأنّ هذا النهج يُطبّق الواجهة ولا يتطلّب استخدام عمليات البتّ، فهو أكثر أمانًا من حيث النوع. [ 30 ] علاوة على ذلك، توجد العديد من المصانع الثابتة التي تسمح بإنشاء الكائنات، مثل طريقة `require` . [ 30 ]EnumSetEnumSetEnumEnumSetSetEnumSet.of()

بعد إدخال ، يُعتبر أسلوب تمثيل حقل البت قديمًا. [ 30 ]EnumSet

فئة HashSet

HashSetيستخدم جدول تجزئة. وبشكل أكثر تحديدًا، يستخدم جدول تجزئة java.util.LinkedHashMapلتخزين التجزئات والعناصر ولمنع التكرارات.

فئة LinkedHashSet

تُوسّع هذه java.util.LinkedHashSetالفئة نطاقها بإنشاء قائمة مرتبطة ثنائياً تربط جميع العناصر بترتيب إدراجها. وهذا يضمن أن يكون ترتيب التكرار على القائمة قابلاً للتنبؤ.HashSetSet

فئة CopyOnWriteArraySet

CopyOnWriteArraySetيُعدّ بديلاً متزامناً للدالة المتزامنة . فهو يُحسّن التزامن في العديد من الحالات عن طريق إزالة الحاجة إلى إجراء التزامن أو إنشاء نسخة من الكائن أثناء التكرار، على غرار كيفية عمل الدالة كبديل متزامن للدالة المتزامنة . [ 31 ] من ناحية أخرى، وكما هو الحال مع الدالة ، لا ينبغي استخدام الدالة عندما يكون التزامن إلزاميًا.SetCopyOnWriteArrayListListCopyOnWriteArrayListCopyOnWriteArraySet

واجهة SortedSet

java.util.SortedSetتُوسّع هذه الواجهة java.util.Setالواجهة. على عكس القائمة العادية Set، تُرتّب عناصر القائمة SortedSetإما حسب طريقة العنصر compareTo(T o)، أو طريقة مُقدّمة إلى مُنشئ القائمة . يُمكن استرجاع SortedSetالعنصرين الأول والأخير من القائمة باستخدام الطريقتين و على التوالي، كما يُمكن إنشاء مجموعات فرعية عبر القيم الدنيا والقصوى، بالإضافة إلى إمكانية البدء أو الانتهاء من بداية أو نهاية القائمة . تُنفّذ هذه الفئة الواجهة. [ 32 ]SortedSetfirst()last()SortedSetjava.util.TreeSetSortedSet

java.util.NavigableSetتُوسّع هذه الواجهة java.util.SortedSetالواجهة الأصلية وتتضمن بعض الدوال الإضافية. تُستخدم floor(E e)الدوال ceiling(E e)و lower(E e)و و higher(E e)للعثور على عنصر في المجموعة قريب من المُعامل. بالإضافة إلى ذلك، Setيتم توفير مُكرِّر تنازلي على عناصر المجموعة. وكما هو الحال مع SortedSet، java.util.TreeSetتُنفِّذ هذه الواجهة NavigableSet. [ 33 ]

فئة TreeSet

java.util.TreeSetيستخدم شجرة حمراء-سوداء مُنفذة بواسطة java.util.TreeMap. تضمن الشجرة الحمراء-السوداء عدم وجود عناصر مكررة. بالإضافة إلى ذلك، فهي تسمح TreeSetبتنفيذ java.util.SortedSet. [ 34 ]

فئة ConcurrentSkipListSet

ConcurrentSkipListSetيعمل كبديل متزامن لتنفيذات متزامنة . على سبيل المثال، يحل محل تطبيق تم تغليفه بواسطة الطريقة. [ 35 ]SortedSetTreeSetsynchronizedMap

واجهات الخرائط

يتم تعريف الخرائط بواسطة java.util.Mapالواجهة في لغة جافا.

تطبيقات واجهة الخريطة

Mapتُعدّ الخرائط هياكل بيانات تربط مفتاحًا بعنصر. وهذا ما يجعل الخريطة مرنة للغاية. إذا كان المفتاح هو رمز التجزئة للعنصر، فإن الخريطة Mapتُصبح في الأساس خريطة Set. أما إذا كان مجرد رقم متزايد، فإنها تُصبح قائمة.

تشمل أمثلة التطبيقات ما يلي : و ، و .Mapjava.util.HashMapjava.util.LinkedHashMapjava.util.TreeMap

فئة الخريطة المجردة

AbstractMapيُعد مثالاً على التنفيذ الهيكلي . [ 14 ]

تشمل الفئات الفرعية المباشرة للفئة ، ، ، ، و .AbstractMapConcurrentSkipListMapEnumMapHashMapIdentityHashMapTreeMapWeakHashMap

خريطة التعداد

EnumMapتتمتع الدالة ` extends` بسرعة مماثلة للمصفوفة ذات الفهرسة الترتيبية. [ 36 ] ويعود ذلك إلى استخدامها الداخلي لمصفوفة، مع إخفاء تفاصيل التنفيذ تمامًا عن المطور. [ 36 ] وبالتالي، تحصل `EnumMap` على أمان النوع مع مزايا أداء المصفوفة. [ 36 ]AbstractMapEnumMapEnumMapMap

خريطة التجزئة

HashMapيستخدم جدول تجزئة . تُستخدم تجزئات المفاتيح للعثور على العناصر في مختلف المجموعات. هذه مجموعة قائمة على التجزئة. [ 37 ]HashMap

خريطة التجزئة المرتبطة

LinkedHashMapتُوسّع هذه الخاصية بإنشاء قائمة مرتبطة ثنائياً بين العناصر، مما يسمح بالوصول إليها بالترتيب الذي أُدرجت به في الخريطة. تحتوي على دالة تُستدعى بواسطة الدالة عند إضافة مفتاح جديد إلى الخريطة . [ 38 ] تُزيل هذه الدالة أقدم عنصر فيها عندما تُرجع القيمة true. [ 38 ] يمكن إعادة تعريف هذه الدالة. [ 38 ]HashMapLinkedHashMapprotectedremoveEldestEntryputMapMapremoveEldestEntryremoveEldestEntry

خريطة الشجرة

TreeMapعلى عكس و ، يستخدم شجرة حمراء-سوداء. تُستخدم المفاتيح كقيم للعقد في الشجرة، وتشير العقد إلى العناصر في . [ 39 ]HashMapLinkedHashMapMap

خريطة التجزئة المتزامنة

ConcurrentHashMapيشبه هذا النوع من المجموعات مجموعة البيانات القائمة على التجزئة، وهو أيضاً كذلك. [ 37 ] ومع ذلك، توجد عدة اختلافات، مثل الاختلافات في استراتيجية القفل التي يستخدمها كل منهما.HashMap

يستخدم هذا الأسلوب استراتيجية تأمين مختلفة تمامًا لتحسين قابلية التوسع والتزامن. [ 37 ] لا يقوم بمزامنة جميع الطرق باستخدام نفس القفل. [ 37 ] بدلاً من ذلك، يستخدم آلية تُعرف باسم تجزئة القفل . [ 37 ] توفر هذه الآلية آلية تأمين أكثر دقة. [ 37 ] كما أنها تسمح بدرجة أعلى من الوصول المشترك. [ 37 ]ConcurrentHashMapConcurrentHashMapConcurrentHashMap

فئة ConcurrentSkipListMap

ConcurrentSkipListMapيعمل كبديل متزامن لتنفيذات متزامنة . وهو مشابه جدًا لـ ، حيث يحل محل الذي تم تغليفه بواسطة الطريقة. [ 35 ]SortedMapConcurrentSkipListMapConcurrentSkipListSetConcurrentSkipListMapTreeMapsynchronizedMap

واجهات فرعية للخريطة

واجهة SortedMap

java.util.SortedMapتُوسّع هذه الواجهة java.util.Mapالواجهة السابقة. تُعرّف هذه الواجهة جدولًا Mapمُرتبًا حسب المفاتيح المُقدّمة. باستخدام الدالة compareTo()المُقدّمة في مُنشئ الجدول ، SortedMapيتم ترتيب أزواج المفاتيح والعناصر حسب هذه المفاتيح. Mapيُمكن استدعاء المفتاح الأول والأخير في الجدول باستخدام الدالتين `first` و`last` على التوالي. بالإضافة إلى ذلك، يُمكن إنشاء خرائط فرعية من المفاتيح الدنيا firstKey()والقصوى lastKey()باستخدام الدالة `submaps` K) subMap(K fromKey, K toKey). SortedMapيتم تنفيذ هذه الواجهة بواسطة [ 40 ]java.util.TreeMap .

java.util.NavigableMapتتوسع الواجهة بطرقٍ java.util.SortedMapمتنوعة. يمكن استدعاء دوال للعثور على المفتاح أو مدخل الخريطة الأقرب إلى المفتاح المُعطى في أيٍّ من الاتجاهين. كما يمكن عكس الخريطة، ويمكن إنشاء مُكرِّر بترتيبٍ عكسي منها. وقد تم تنفيذ ذلك بواسطة [ 41 ]java.util.TreeMap .

واجهة ConcurrentMap

java.util.concurrent.ConcurrentMapتُوسّع هذه الواجهة java.util.Mapواجهة أخرى. هذه الواجهة هي واجهة آمنة للخيوط ، وقد تم تقديمها بدءًا من الإصدار 1.5 من إطار عمل مجموعات جافا للغة البرمجة جافا . [ 20 ]Map

إضافات لإطار عمل مجموعات جافا

يتم توسيع إطار عمل مجموعات جافا بواسطة مكتبة Apache Commons Collections، التي تضيف أنواعًا من المجموعات مثل الحقيبة والخريطة ثنائية الاتجاه، بالإضافة إلى أدوات لإنشاء الاتحادات والتقاطعات. [ 42 ]

أصدرت جوجل مكتبات مجموعاتها الخاصة كجزء من مكتبات جوافة .

انظر أيضاً

الاستشهاد

  1. "درس: مقدمة إلى المجموعات" . شركة أوراكل . تم الاطلاع عليه بتاريخ 22-12-2010 .
  2. 1 2 3 بلوخ 2018 ، ص 126-129، الفصل §5 البند 28: تفضيل القوائم على المصفوفات.
  3. 1 2 هورستمان، كاي (2014). كائنات جافا المبكرة الكبيرة .
  4. 1 2 "إطار عمل مجموعات جافا" (ملف PDF) . شركة IBM . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 2011-08-07.
  5. بيكر، دان (1 نوفمبر 1998). "ابدأ باستخدام إطار عمل مجموعات جافا" . جافا وورلد . تم الاطلاع عليه بتاريخ 13 يوليو 2020. قبل ظهور المجموعات، كانت الطرق القياسية لتجميع كائنات جافا هي المصفوفة، والمتجه، وجدول التجزئة . لكل من هذه المجموعات الثلاث طرق وصيغة مختلفة للوصول إلى عناصرها: تستخدم المصفوفات رمز الأقواس المربعة ([])، ويستخدم المتجه طريقة elementAt، بينما يستخدم جدول التجزئة طرقًا أخرى .getput
  6. 1 2 ليا، دوغ . "نظرة عامة على حزمة المجموعات" . تم الاطلاع عليه بتاريخ 1 يناير 2011. تتضمن حزمة تطوير جافا من صن JDK 1.2 أخيرًا مجموعة قياسية من فئات المجموعات. على الرغم من وجود بعض الاختلافات في التصميم والتنفيذ، إلا أن حزمة JDK 1.2 تحتوي على معظم التجريدات الأساسية والبنية والوظائف نفسها الموجودة في هذه الحزمة. لهذا السبب، لن يتم تحديث حزمة المجموعات هذه.
  7. "مكتبة المجموعات العامة لجافا™" . مؤرشفة من الأصل بتاريخ 12-03-2009 . تم الاطلاع عليها بتاريخ 01-01-2011 .
  8. فان هيلسوي، لورانس (1 يونيو 1997). "هل تحتاج إلى مجموعة جيدة من هياكل البيانات المجردة؟ مكتبة جافا العامة (JGL) من ObjectSpace قوية للغاية!" . JavaWorld . تم الاسترجاع في 13 يوليو 2020. كما هو الحال مع لغة جافا نفسها، تستعير مكتبة جافا العامة (JGL) بشكل كبير من لغة C++: فهي تأخذ أفضل ما في مكتبة STL الخاصة بلغة C++، مع تجنب عيوبها. يعرف معظم مبرمجي C++ اليوم مكتبة STL، لكن قلة منهم فقط يستغلون إمكانياتها.
  9. فان هيلسوي، لورانس (1 يناير 1999). "معركة أطر عمل الحاويات: أيها يجب أن تستخدم؟" . جافا وورلد . تم الاسترجاع في 13 يوليو 2020. إن مقارنة إطار عمل JGL من شركة ObjectSpace Inc. وإطار عمل Collections من شركة Sun أشبه بمقارنة التفاح بفاكهة الكيوي. للوهلة الأولى، يبدو أن الإطارين يتنافسان على نفس المطورين، ولكن بعد التدقيق، يتضح أنه لا يمكن مقارنتهما بشكل عادل دون الاعتراف أولاً بأن لكل منهما أهدافًا مختلفة. إذا كان إطار عمل Collections، كما هو مذكور في وثائق Sun، سيعمل على توحيد واجهات برمجة تطبيقات Sun (واجهة برمجة التطبيقات الأساسية، والإضافات، وما إلى ذلك)، فمن الواضح أن Collections سيكون خبرًا سارًا، بل وأمرًا جيدًا، حتى لأكثر المتحمسين لإطار عمل JGL. شريطة ألا تخلف Sun وعدها في هذا المجال، سأكون سعيدًا باستثمار مواردي في تبني Collections بجدية.
  10. ليا، دوغ . "نظرة عامة على حزمة util.concurrent الإصدار 1.3.4" . تم الاطلاع عليه بتاريخ 1 يناير 2011. ملاحظة: عند إصدار J2SE 5.0، ستدخل هذه الحزمة في وضع الصيانة: سيتم إصدار التصحيحات الأساسية فقط. تتضمن حزمة java.util.concurrent الخاصة بـ J2SE5 إصدارات محسّنة وأكثر كفاءة وموحدة من المكونات الرئيسية في هذه الحزمة.
  11. بلوخ 2018 ، ص 87-92، الفصل §8 البند 8: تفضيل التركيب على الميراث.
  12. "Iterable (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . تم الاطلاع عليه بتاريخ 2013-08-16 .
  13. بلوخ 2018 ، الصفحات 117-122، الفصل §5 البند 26: لا تستخدم الأنواع الخام.
  14. 1 2 3 بلوخ 2018 ، ص 99-103 ، الفصل §4 البند 20: تفضيل الواجهات على الفئات المجردة.
  15. "قائمة (منصة جافا SE 7)" . Docs.oracle.com. 2013-06-06 . تم الاطلاع عليه بتاريخ 2013-08-16 .
  16. 1 2 بلوخ 2018 ، ص 87-92 ، الفصل §4 البند 18: تفضيل التركيب على الميراث.
  17. 1 2 3 بلوخ 2018 ، ص 317-322 ، الفصل §11 البند 79: تجنب التزامن المفرط.
  18. 1 2 بلوخ 2018 ، ص 280-281 ، الفصل §9 البند 64: الإشارة إلى الكائنات من خلال واجهاتها.
  19. "PriorityQueue (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . تم الاطلاع عليه بتاريخ 2013-08-16 .
  20. 1 2 3 Goetz et al. 2006 ، ص 84-85 ، §5.2 المجموعات المتزامنة.
  21. 1 2 3 Goetz et al. 2006 ، ص 52-53 ، §3.5.3 مصطلحات النشر الآمن.
  22. Bloch 2018, pp. 325–329, Chapter §11 Item 78: Synchronize access to shared mutable data.
  23. "BlockingQueue (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  24. Bloch 2018, pp. 325–329, Chapter §11 Item 81: Prefer concurrency utilities to wait and notify.
  25. 12Goetz et al. 2006, p. 92, §5.3.3 Deques and work stealing.
  26. "Deque (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  27. 12"Queue (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  28. "BlockingDeque (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  29. 12345Bloch 2018, pp. 5–9, Chapter §5 Use EnumSet instead of bit fields.
  30. 1234567891011Bloch 2018, pp. 169–170, Chapter §5 Use EnumSet instead of bit fields.
  31. Goetz et al. 2006, pp. 86–89, §5.2.3 CopyOnWriteArrayList.
  32. "SortedSet (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  33. "NavigableSet (Java Platform SE 7)". Docs.oracle.com. 2013-06-06.
  34. "Set (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  35. 12Goetz et al. 2006, pp. 84–85, §5.2 ConcurrentCollections.
  36. 123Bloch 2018, pp. 171–175, Chapter §6 Item 36: Use EnumMap instead of ordinal indexing.
  37. 1234567Goetz et al. 2006, pp. 85–86, §5.2.1 ConcurrentHashMap.
  38. 123Bloch 2018, pp. 199–202, Chapter §44 Favor the use of standard functional interfaces.
  39. "Map (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  40. "SortedMap (Java Platform SE 7)". Docs.oracle.com. 2013-06-06. Retrieved 2013-08-16.
  41. "NavigableMap (Java Platform SE 7)" . Docs.oracle.com. 2013-06-06 . تم الاطلاع عليه بتاريخ 2013-08-16 .
  42. "المجموعات - الصفحة الرئيسية" . Commons.apache.org. 2013-07-04 . تم الاسترجاع في 2013-08-16 .

مراجع

  • بلوخ، جوشوا (2018). "جافا الفعّالة: دليل لغة البرمجة" (  الطبعة الثالثة). أديسون-ويسلي. ISBN 978-0134685991.
  • جوتز، برايان؛ بيرلز، تيم؛ بلوخ، جوشوا؛ بوبير، جوزيف؛ هولمز، ديفيد؛ ليا، دوغ (2006). التزامن في جافا عمليًا . أديسون ويسلي. ISBN 0-321-34960-1. OL 25208908M .