إتقان Java Collections
يعتمد معظم المطورين بشكل افتراضي على ArrayList أو HashSet. هذا يعمل في المهام البسيطة، لكنه يفشل عندما تحتاج إلى السرعة أو التوسع.
قمت ذات مرة ببناء لوحة صدارة (leaderboard) للعبة باستخدام ArrayList عادية. كنت أقوم بفرزها في كل مرة تتغير فيها النتيجة، مما أدى إلى تجمد واجهة المستخدم باستمرار. كنت أحارب اللغة بدلاً من استخدامها.
توقف عن استخدام الأدوات الخاطئة. استخدم هذه المجموعات (collections) الثلاث المتخصصة لكتابة كود أسرع وأنظف.
- EnumSet لثوابت Enum
إذا استخدمت HashSet للـ enums، فستدفع ضريبة في الأداء. فكل عملية إدراج تقوم بتحويل الـ enum إلى كائن (boxing)، مما يضيف عبئاً غير ضروري.
يستخدم EnumSet ناقل بتات (bit vector)، ويقوم بإجراء الفحوصات باستخدام تعليمات وحدة المعالجة المركزية (CPU instruction) واحدة.
- استخدمه عندما يكون لديك مجموعة ثابتة من قيم enum.
- يقلل من عمليات جمع المهملات (garbage collection).
- يوفر زيادة في السرعة بمقدار 10 أضعاف في الحلقات المكثفة (tight loops).
قبل:
Set
بعد:
EnumSet
- NavigableSet لاستعلامات النطاق (Range Queries)
إن المرور يدوياً عبر قائمة مرتبة للعثور على نطاق معين هو أمر بطيء وعرضة للأخطاء، وغالباً ما ينتهي بك الأمر بأخطاء "الفرق بمقدار واحد" (off-by-one bugs).
يحافظ NavigableSet على بياناتك مرتبة تلقائياً، ويوفر عمليات بحث بتعقيد O(log n) للمجموعات الفرعية.
- استخدمه لجداول أعلى النتائج أو نطاقات الأسعار.
- استخدم headSet() أو subSet() للحصول على نطاقات محددة.
- يلغي الحاجة إلى كود الفرز اليدوي.
قبل:
Collections.sort(scores);
List
بعد:
NavigableSet
- CopyOnWriteArrayList للقوائم التي يكثر فيها القراءة (Read-Heavy Lists)
إن استخدام كتل المزامنة (synchronized blocks) على ArrayList يبطئ كل عملية قراءة، كما يتسبب في حدوث ConcurrentModificationException إذا قام أحد الخيوط (threads) بالكتابة بينما يقوم خيط آخر بالقراءة.
يقوم CopyOnWriteArrayList بإنشاء نسخة جديدة من المصفوفة عند كل عملية كتابة، بينما يقرأ المستخدمون لقطة (snapshot) من المصفوفة.
- استخدمه لمستمعي الأحداث (event listeners) أو إعدادات التكوين (configuration settings).
- استخدمه عندما تحدث عمليات القراءة بشكل أكثر بكثير من عمليات الكتابة.
- يسمح بعمليات قراءة بدون أقفال (lock-free).
قبل:
List
بعد:
CopyOnWriteArrayList
توقف عن استخدام نفس المجموعتين (collections) كخيار افتراضي. اختر الأداة التي تتوافق مع نمط بياناتك.
المصدر: https://dev.to/timevolt/the-java-collections-force-mastering-the-hidden-gems-like-a-jedi-4438