مصدر المقال: مؤلف الإنترنت: PaleSting/CSDN
في هذه المقالة، سنلقي نظرة على أنواع البيانات في Java، لكننا سنقدم مفهوم أنواع البيانات المجردة (ADT). سنتعرف أيضًا على بعض أدوات ADT المحددة بواسطة Java من خلال تقديم Java Collections Framework.
ADT
يتم تعريف ADT فقط من خلال نوع البيانات الذي يحمله والعمليات التي يمكن تنفيذها على نوع البيانات هذا. لا يمكن للمطورين الوصول إلى خصائص ADT إلا من خلال طرق تشغيل ADT، ولن يعرفوا كيفية تنفيذ العمليات المختلفة داخل نوع البيانات هذا.
في Java، نستخدم غالبًا واجهة لتوفير مجموعة من العمليات دون الكشف عن تفاصيل تنفيذ هذه العمليات. تذكر أن الواجهة تحدد مجموعة من الأساليب ويجب على فئة Java تنفيذ هذه المجموعة من أجل تلبية شروطها الإلزامية أو تنفيذ مثيل للواجهة.
الجداول الخطية والمكدسات وطوابير الانتظار
عندما نتحدث عن ADT، فإننا غالبًا ما نتحدث عن القوائم الخطية والمكدسات وطوابير الانتظار. لن نناقش تفاصيل هياكل البيانات هذه، ولكننا سنناقش سبب تسميتها بـ ADTs.
القائمة الخطية عبارة عن مجموعة من العناصر المحدودة مرتبة بطريقة خطية وتوفر الوصول المباشر إلى عناصرها. المكدس عبارة عن قائمة خطية مرتبة أخيرًا ما يخرج أولاً (LIFO) تتم إضافة العناصر إليها وإزالتها من رأس المكدس. قائمة الانتظار عبارة عن قائمة خطية مرتبة حسب ما يدخل أولاً يخرج أولاً، وتتم إضافة العناصر من نهاية قائمة الانتظار ويتم أخذها من رأس قائمة الانتظار.
يمكن تنفيذ الهياكل الداخلية للقوائم الخطية والمكدسات وطوابير الانتظار بعدة طرق. على سبيل المثال، يمكننا استخدام مصفوفة مرتبة أو قائمة مرتبطة لتنفيذ كل بنية. النقطة الأساسية هي أنه بغض النظر عن كيفية تنفيذ بنيته الداخلية، فإن واجهته الخارجية ستظل دائمًا كما هي. يتيح لك هذا تعديل التطبيق الأساسي أو ترقيته دون تغيير الواجهة العامة.
بنية مجموعة جافا
توفر مجموعة تطوير برامج Java 2 (SDK) فئات جديدة لدعم أدوات ADT الأكثر استخدامًا. تسمى هذه الفئات فئات مجموعة Java (على غرار فئات المجموعة في MFC)، وتعمل معًا لتكوين بنية مجموعة Java. توفر بنية المجموعة هذه مجموعة من الواجهات والفئات التي تمثل البيانات فيما يسمى ببيانات المجموعة المجردة.
يتم استخدام واجهة java.util.Collection لتمثيل أي مجموعة من الكائنات، أي العناصر. توفر هذه الواجهة العمليات الأساسية مثل الإضافة والحذف والاستعلام. توفر واجهة المجموعة أيضًا طريقة مكررة. يقوم أسلوب التكرار بإرجاع مثيل للواجهة java.util.Iterator. توفر واجهة Iterator أساليب hasNext وnext وremove. باستخدام الطرق التي توفرها واجهة Iterator، يمكنك تكرار المثيلات الموجودة في كائن Collection من البداية إلى النهاية وحذف العنصر الذي يمثله المكرر (المؤشر) بأمان.
java.util.AbstractCollection هو الأساس لجميع فئات بنية المجموعة. توفر فئة AbstractCollection تطبيقات لجميع الأساليب في واجهة java.util.Collection باستثناء أساليب التكرار والحجم. يتم تنفيذ طريقتي الاستثناء هاتين بواسطة كافة الفئات الفرعية التي ترث java.util.AbstractCollection.
يجب أن توفر الفئة التي تنفذ الواجهة تنفيذًا لجميع أساليب الواجهة. نظرًا لأن بعض طرق الواجهة في بنية المجموعة اختيارية، فيجب أن تكون هناك طريقة لإعلام المتصل بعدم تنفيذ طريقة معينة. عند تنفيذ أسلوب اختياري وعدم تنفيذ هذا الأسلوب، يتم طرح UnsupportedOperationException. ترث فئة UnsupportedOperationException فئة RuntimeException. يسمح هذا للمتصل باستدعاء جميع عمليات التجميع دون وضع كل مكالمة في زوج محاولة الالتقاط.
قائمة الجدول الخطي
ترث واجهة القائمة واجهة المجموعة وتحدد مجموعة مرتبة تسمح بوجود عناصر متطابقة. تضيف واجهة القائمة أيضًا طرقًا تستخدم قيمة فهرس رقمية للعمل على العناصر الموجودة في المجموعة بناءً على موضع العنصر في القائمة الخطية. تتضمن هذه العمليات الإضافة والحصول والضبط والإزالة.
توفر واجهة القائمة أيضًا طريقة listIterator. تقوم هذه الطريقة بإرجاع مثيل للواجهة java.util.ListIterator، والتي تسمح لك باجتياز قائمة خطية من البداية إلى النهاية أو من النهاية إلى النهاية. java.util.ListIterator يرث واجهة java.util.Iterator. ولذلك فهو يدعم إضافة وتعديل العناصر في المجموعة التي يمثلها.
يوضح المثال التالي كيفية اجتياز عناصر القائمة من الخلف إلى الأمام. ولتحقيق ذلك، يجب وضع ListIterator بعد العنصر الأخير في القائمة قبل بدء الاجتياز.
ListIterator iter = aList.listIterator(aList.size());
بينما (iter.hasPrevious())
System.out.println(iter.previous().toString());
}
توفر بنية المجموعة تطبيقين لواجهة القائمة: LinkedList (قائمة مرتبطة) وArrayList (قائمة المصفوفات، أي القائمة الثابتة). يدعم كلا التطبيقين الوصول العشوائي إلى عناصرهما. يدعم مثيل ArrayList عمليات نمط المصفوفة ويدعم عمليات تغيير حجم المصفوفة. يوفر مثيل LinkedList دعمًا صريحًا لإضافة العناصر وإزالتها وتوفيرها في بداية القائمة ونهايتها. باستخدام هذه الطرق الجديدة، يمكن للمبرمج ببساطة استخدام LinedList كمكدس أو قائمة انتظار، على النحو التالي:
LinkedList aQueue = new LinkedList(aCollection);
aQueue.addFirst(newElement);
Object anElement = aQueue.removeLast();
LinkedList aStack = new LinkedList(aCollection);
aStack.addFirst(newElement);
Object anElement= aStack.removeFirst();
يوضح مقتطف التعليمات البرمجية الموجود في الجدول أ بعض العمليات الشائعة في مثيلات التنفيذ للواجهة java.util.List باستخدام java.util.ArrayList وjava.util.LinkedList. تتضمن هذه العمليات إضافة عناصر، والوصول إلى العناصر بشكل عشوائي، وإزالة العناصر بشكل صريح من نهاية القائمة.
إن معرفة ما يحدث وعدم معرفة السبب له فائدة كبيرة
توفر ADT أداة قوية لفصل العمليات في الواجهة العامة للكائن عن تنفيذها الملموس. يسمح هذا لتطبيق ADT بالتغيير والتطور مع الحفاظ على واجهته العامة دون تغيير. توفر بنية مجموعة Java عددًا كبيرًا من الواجهات والتطبيقات التي تمثل مجموعات من العناصر الأساسية ويمكن استخدامها لإنشاء أدوات مساعدة مساعدة (ADTs) مفيدة.