بادئ ذي بدء ، ننظر إلى كلا الفئتين اللتين تنفذ واجهات القائمة ، وهناك ثلاث فئات تنفيذ في واجهة قائمة ، وهي ArrayList و Vector و LinkedList. تُستخدم القائمة لتخزين عناصر متعددة ، ويمكنها الحفاظ على ترتيب العناصر ، وتسمح بتكرار العناصر.
الاختلافات ذات الصلة بين فئات التنفيذ المحددة الثلاثة هي كما يلي:
1. ArrayList هي فئة تنفيذ القائمة الأكثر استخدامًا ، والتي يتم تنفيذها داخليًا من خلال المصفوفات ، والتي تتيح الوصول العشوائي السريع إلى العناصر. عيب المصفوفات هو أنه لا يمكن أن يكون هناك تباعد بين كل عنصر. عندما لا يكون حجم الصفيف غير راضٍ ، يجب زيادة سعة التخزين. من الضروري أن نقول أن بيانات المباراة التي تم نسخها بالفعل إلى مساحة التخزين الجديدة. عند إدخال العناصر أو حذفها من الوضع الأوسط من قائمة ArrayList ، يجب نسخ الصفيف ونقله وتكلفة مرتفعة نسبيًا. لذلك ، فهي مناسبة للبحث العشوائي والمرور ، وليس للإدراج والحذف.
2. يتم تنفيذ المستشار أيضًا من خلال المصفوفات ، والفرق هو أنه يدعم مزامنة مؤشرات الترابط ، أي في لحظة معينة ، يمكن لخيط واحد فقط أن يكتب متجهًا لتجنب عدم الاتساق بسبب كتابة خيوط متعددة في نفس الوقت ، ولكنه يكلف الكثير لتنفيذ المزامنة ، وبالتالي فإن الوصول إليه أبطأ من الوصول إلى ArrayList.
3. يستخدم LinkedList هيكل قائمة مرتبطة لتخزين البيانات ، وهو مناسب جدًا للإدراج الديناميكي وحذف البيانات ، وسرعات الوصول العشوائي بطيئة نسبيًا. بالإضافة إلى ذلك ، فإنه يوفر أيضًا طرقًا لم يتم تعريفها في واجهة القائمة ، والتي يتم استخدامها خصيصًا لتشغيل عناصر رأس الجدول وعناصر الذيل ، ويمكن استخدامها كودادة ، قوائم قوائم وقوائم ثنائية الاتجاه.
عند النظر إلى رمز مصدر Java ، وجدت أنه عندما لا يكون حجم الصفيف كافيًا ، فأنا بحاجة إلى إعادة إنشاء الصفيف ثم نسخ العناصر إلى الصفيف الجديد. يختلف حجم المصفوفة الموسعة من ArrayList و Vector.
ArrayList:
إضافة منطقية عامة (e e) {insureCapacity (size + 1) ؛ // إضافة عناصر لتحديد ما إذا كان يمكنها استيعابها. إذا لم تتمكن من ذلك ، يجب عليك إنشاء صفيف جديد elementData [size ++] = e ؛ return true ؛} public void insureCapacity (int mincapacity) {modcount ++ ؛ int oldcapacity = elementData.Length ؛ if (mincapacity> oldCapacity) {Object OldData [] = elementData ؛ // لم يظهر هذا الخط الفائدة ، لا أعرف ما الذي يفكر فيه المطورون في int newCapacity = (OldCapacity * 3)/2 + 1 ؛ // أضف حجم الصفيف الجديد إذا (newCapacity <mincapacity) newCapacity = mincapacity ؛ // عادة ما تكون Mincapacity قريبة من الحجم ، لذلك هذا هو الفوز: elementData = Arrays.copyof (ElementData ، NewCapacity) ؛ }}في المتجه:
private void insureCapacityHelper (int mincapacity) {int oldcapacity = elementData.Length ؛ if (mincapacity> oldCapacity) {object [] oldData = elementData ؛ int newCapacity = (courceincrement> 0)؟ (OldCapacity + cubleincrement): (OldCapacity * 2) ؛ if (newCapacity <mincapacity) {newCapacity = minCapacity ؛ } elementData = arrays.copyof (elementData ، newCapacity) ؛ }}الفرق بين ArrayList و Vector هو كما يلي:
يتم توسيع ArrayList بنسبة 50 ٪ + 1 افتراضيًا عندما لا تكون هناك ذاكرة كافية ، ويتم توسيع المتجه بمقدار 1 مرات بشكل افتراضي.
يوفر Vector واجهة IndexOF (OBJ ، ابدأ) ، لكن ArrayList لا.
تكون المتجهات في مستوى سلامة الخيط ، ولكن في معظم الحالات ، لا يتم استخدام المتجهات لأن سلامة الخيط تتطلب أكبر نظام للنظام.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.