مقدمة
في مثال التعليمات البرمجية لتحليل تجمع اتصال قاعدة البيانات، يمكنك أن ترى أن التعداد يُستخدم لاجتياز مجموعة المتجهات. لاحقًا، بحثت عن بعض المعلومات لمعرفة الطرق التي يمكن استخدامها لاجتياز فئات التجميع، ووجدت الأمثلة التالية على الإنترنت لاستخدام Enumeration وIterator لاجتياز فئات التجميع. ومع ذلك، ذكر هذا المثال أن التعداد أكثر كفاءة من Iterator. في الواقع، هذا ليس هو الحال . اختبار الوقت في هذا المثال أحادي الجانب للغاية لأن كمية البيانات صغيرة جدًا. ومع زيادة عدد البيانات، تصبح الكفاءة بين الاثنين أقرب فأقرب، دون ظهور نسبة المضاعفات. علاوة على ذلك، يُستخدم Iterator الآن بشكل شائع لاجتياز فئات المجموعة. فقط تلك التي تعلن على وجه التحديد أنه يجب استخدام التعداد هي التي ستستخدم هذه الفئة لاجتياز المجموعات.
مثال على الكود
انسخ رمز الكود كما يلي:
الحزمة edu.sjtu.erplab.hash؛
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
// مثيل قابل للتجزئة للاجتياز
الطبقة العامة TraveseHashTable {
public static void main(String[] args) {
// تهيئة وإنشاء جدول التجزئة
Hashtable<String, String> ht = new Hashtable<String, String>();
لـ (int i = 0; i < 10000; i++) {
ht.put("Key=" + i, "Val =" + i);
}
// 1. استخدم التعداد
بداية طويلة = System.currentTimeMillis();
Enumeration<String> en = ht.keys();// استخدم التعداد للحصول على المفتاح
بينما (en.hasMoreElements()) {
en.nextElement();
}
long end = System.currentTimeMillis();
System.out.println("تكاليف مفاتيح التعداد" + (النهاية - البداية)
+ "ميلي ثانية")؛
// 2. استخدم التعداد
ابدأ = System.currentTimeMillis();
Enumeration<String> en2 = ht.elements();// استخدم التعداد للحصول على زوج القيمة الرئيسية هذا
بينما (en2.hasMoreElements()) {
en2.nextElement();
}
النهاية = System.currentTimeMillis();
System.out.println("تكاليف عناصر التعداد" + (النهاية - البداية)
+ "ميلي ثانية")؛
// 3. التكرار
ابدأ = System.currentTimeMillis();
Iterator<String> it = ht.keySet().iterator();// استخدم مكررًا للحصول على هذا المفتاح
بينما (it.hasNext()) {
it.next();
}
النهاية = System.currentTimeMillis();
System.out.println("تكاليف مجموعة مفاتيح التكرار" + (النهاية - البداية)
+ "ميلي ثانية")؛
// 4. التكرار
ابدأ = System.currentTimeMillis();
Iterator<Entry<String, String>> it2 = ht.entrySet().iterator();// استخدم مكررًا للحصول على زوج المفتاح والقيمة هذا
بينما (it2.hasNext()) {
it2.next();
}
النهاية = System.currentTimeMillis();
System.out.println("تكاليف مجموعة إدخال التكرار" + (النهاية - البداية)
+ "ميلي ثانية")؛
}
}
الواجهة المهملة: التعداد
تم تقديم واجهة Enumeration في JDK 1.0 وهي أفضل واجهة إخراج للتكرار. عندما تم استخدام Vector لأول مرة (يوصى الآن باستخدام ArrayList)، تم استخدام واجهة Enumeration للإخراج. على الرغم من أن فئة Enumeration قديمة، إلا أنه تم توسيع فئة Enumeration بعد JDK1.5 لإضافة تطبيقات عمليات عامة.
تتضمن الطرق الشائعة الاستخدام لواجهة التعداد hasMoreElements() (لتحديد ما إذا كانت هناك قيمة تالية) وnextElement() (لإزالة العنصر الحالي). تشبه وظائف هذه الطرق وظيفة Iterator، باستثناء وجود طريقة لذلك حذف البيانات في Iterator، لكن هذه الواجهة لا تحتوي على خاصية الحذف.
لماذا الاستمرار في استخدام واجهة التعداد؟
تتمتع واجهات Enumeration وIterator بوظائف متشابهة، ولدى Iterator وظائف أكثر من Enumeration، فلماذا نستخدم Enumeration؟ وذلك لأن تطوير Java قد مر لفترة طويلة، ولا تزال بعض الأنظمة أو الأساليب القديمة في مكتبات الفئات تستخدم واجهة التعداد، لذلك، من أجل التوافق، لا تزال هناك حاجة إلى استخدام التعداد.
الفئات الفرعية الشائعة لواجهة القائمة
تشمل الفئات الفرعية شائعة الاستخدام لواجهة القائمة ArrayList وVector، ولهما العديد من أوجه التشابه.