مقارنة بين Java Vector و ArrayList
لقد درست اليوم رموز مصدر المتجه وقائمة ArrayList ، وعمق فهمي لهاتين الفئتين.
هناك ثلاث فئات تم تنفيذها في واجهة القائمة: ArrayList ، Vector ، و LinkedList. لن أقول الكثير عن LinkedList ، يتم استخدامه بشكل عام للحفاظ على ترتيب إدخال البيانات.
يتم تنفيذ كل من ArrayList و Vector باستخدام المصفوفات ، وهناك ثلاثة اختلافات رئيسية:
1. المتجه متعدد الخيوط وآمن ، في حين أن ArrayList ليس كذلك. يمكن رؤية هذا من رمز المصدر. يتم تعديل العديد من الطرق في فئة المتجه عن طريق المزامنة ، مما يؤدي إلى كفاءة المتجه التي لا يمكن مقارنتها مع ArrayList ؛
2. يستخدم كلاهما عناصر تخزين المساحة المستمرة الخطية ، ولكن عندما تكون المساحة غير كافية ، تتم إضافة الفئتين بشكل مختلف. يقول العديد من مستخدمي الإنترنت أن Vector يضاعف المساحة الأصلية ، ويزيد ArrayList من المساحة الأصلية بنسبة 50 ٪. في الواقع ، هذا هو نفس الشيء. ومع ذلك ، لا تزال هناك بعض المشكلات التي يمكن رؤيتها من رمز المصدر ، وسيتم تحليلها من رمز المصدر لاحقًا.
3. يمكن أن يضع ناقل عامل النمو ، لكن لا يمكن لـ ArrayList. عندما نظرت إلى هذا لأول مرة ، لم أفهم ما هو العامل الإضافي. ومع ذلك ، فهمت هذا من خلال مقارنة رمز المصدر. دعونا أولاً نلقي نظرة على طرق بناء الفئتين:
ArrayList لديه ثلاث طرق بناء:
ArrayList Public (int initialcapacity) // إنشاء قائمة فارغة مع السعة الأولية المحددة. ArrayList Public () // قم بإنشاء قائمة فارغة بسعة أولية تبلغ 10
المتجه لديه أربعة منشئين:
Public Vector () // إنشاء متجه فارغ باستخدام السعة الأولية المحددة وزيادة السعة تساوي الصفر. المتجه العام (int initialcapacity) // قم بإنشاء متجه فارغ لجعل حجم صفيف البيانات الداخلي ، وزيادة قدرتها القياسية هي صفر. المتجه العام (المجموعة <؟ تمتد e> c) // قم بإنشاء ناقل يحتوي على عناصر في المتجه العام المحدد (int initialcappacity ، int courncrement) // قم بإنشاء متجه فارغ باستخدام السعة الأولية المحددة وسعة السعة
المتجه لديه طريقة بناء واحدة أكثر من ArrayList. هذا صحيح ، طريقة بناء المتجه العام (int initialCappacity ، int courceincrement). السعة هو نمو القدرات ، وهو عامل النمو المذكور أعلاه ، وهو غير متوفر في ArrayList.
ثم انشر فئتين لإضافة تحليل رمز المصدر (إصدار JDK1.7):
// ArrayList Class Add Code Source Code: Public Boolean Add (e e) {insureCapacityInternal (size + 1) ؛ // زيادة modcount !! elementData [size ++] = e ؛ العودة صحيح. } private void insureCapacityInternal (int mincapacity) {modcount ++ ؛ // رمز وعي الفائض // إذا كان حجم الحاوية الجديدة بعد إضافة عنصر جديد أكبر من سعة الحاوية ، فلا يمكن حفظ القيمة. يجب توسيع المساحة إذا تنمو (mincapacity - elementData.Length> 0) (mincapacity) ؛ } private void تنمو (int mincapacity) {// overflow-concious code int oldcapacity = elementData.Length ؛ int newCapacity = OldCapacity + (OldCapacity >> 1) ؛ // تزداد مساحة التوسع بنسبة 50 ٪ (أي 1.5 أضعاف الأصل) إذا (NewCapacity - minicapacity <0) // إذا كانت الحاوية لا تزال غير كافية بعد التوسع ، فما عليك سوى تعيين طاقة دقيقة على حجم الحاوية newCapacity = minucapity ؛ if (newCapacity - max_array_size> 0) // إذا كانت الحاوية الموسعة كبيرة جدًا ، فعليك تنفيذ HugeCapacity newCapacity = hugecapacity (mincapacity) ؛ // عادة ما تكون Mincapacity قريبة من الحجم ، لذلك هذا هو الفوز: elementData = Arrays.copyof (ElementData ، NewCapacity) ؛ } إضافة رمز المصدر إلى فئة المتجه:
إضافة منطقية متزامنة عامة (e e) {modcount ++ ؛ insureCapacityHelper (elementCount + 1) ؛ elementData [elementCount ++] = e ؛ العودة صحيح. } private void insureCapacityHelper (int mincapacity) {// الكود الفائض الواعي إذا (mincapacity - elementData.length> 0) تنمو (mincapacity) ؛ } private void تنمو (int mincapacity) {// overflow-concious code int oldcapacity = elementData.Length ؛ int newCapacity = OldCapacity + ((courceincrement> 0)؟ cubleincrement: OldCapacity) ؛ /** يتطلب توسيع السعة هذا الحكم: إذا لم تتم تهيئة زيادة السعة بمقدار 0 ، أي أن تهيئة المتجه العام (int initialcapacity ، int capacitincrement) ، فإن قدرة توسيع السعة (OldCapacity+courmincrement) ، والتي هي قيمة القدرات الأصلية بالإضافة إلى زيادة القدرات ؛ إذا لم يتم ضبط زيادة السعة ، فإن السعة بعد التوسع تكون (OldCapacity+OldCapacity) ، وهو ضعف السعة الأصلية. **/ if (newCapacity - mincapacity <0) newCapacity = minCapacity ؛ if (newCapacity - max_array_size> 0) newCapacity = hugecapacity (mincapacity) ؛ elementData = arrays.copyof (elementData ، newCapacity) ؛ }من خلال التحليل ، يجب أن يكون مفهوما الآن!
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!