المتجه مقابل ArrayList في جافا
ArrayList و Vector هما الفئتان الأكثر استخداما في الحزمة جمع< / امتداد> من جافا والفرق بين Vector و ArrayList هو سؤال متكرر للغاية. في حين أن هذا سؤال بسيط ، من المهم معرفة وقت استخدام Vector أو ArrayList ، خاصة عندما تعمل في مشروع كبير.في هذه المقالة ، سنلقي نظرة على نقاط الاختلاف بين Vector و ArrayList في Java ونحاول فهم المفهوم الكامن وراء هذه الاختلافات.
قبل أن ندخل في الاختلافات بين Vector و Vector و ArrayList ، دعنا نرى أوجه التشابه بين هذين:
- Vector و ArrayList يستخدمان بنية تخزين قابلة للتوسيع.
- ArrayList و Vector يستخدمان بنية صفيف داخلية.
- تحافظ كلتا القائمتين على الترتيب الذي يتم به إدراج العناصر. هذا يعني أنه يمكنك استرداد الكائن بالترتيب الذي تم إدراجه به إذا كنت تستعرض ArrayList أو Vector.
- Vector و ArrayList يسمحان بالعناصر المكررة ، والقيم الخالية.< / li>
- المكرر و listIterator التي تم إرجاعها بواسطة Vector و ArrayList من النوع fail-fast.
Vector vs ArrayList
1) لا تتم مزامنة Synchronization< / b>< / div>
ArrayList ، مما يعني أنه يمكن لسلاسل رسائل متعددة الوصول إليها في نفس الوقت. على سبيل المثال، إذا كان مؤشر ترابط يقوم بتنفيذ عملية إلحاق في ArrayList، قد يقوم مؤشر ترابط آخر بإجراء عملية حذف متوازية في بيئة متعددة مؤشرات الترابط غير متزامنة.
Vector متزامن. وهذا يضمن الاستخدام الآمن لمؤشرات الترابط في بيئة متزامنة ومتعددة الخيوط. على سبيل المثال، إذا كان مؤشر ترابط يقوم بإجراء عملية في Vector، فلن يتمكن أي مؤشر ترابط آخر من الوصول إليه حتى ينتهي مؤشر الترابط الأول. على عكس ArrayList ، يمكن لمؤشر ترابط واحد فقط إجراء عملية في كل مرة.
2) الأداء
ArrayList أكثر أداء وأسرع لأنه غير متزامن ، مما يجعله خيارا جيدا جدا في بيئة أحادية الخيوط. يمكنك أيضا استخدام ArrayList في بيئة متعددة مؤشرات الترابط إذا كانت مؤشرات الترابط تقرأ فقط قيم ArrayList.
نظرا لأن Vector متزامن ، فإنه يدفع ثمن المزامنة ، مما يجعله بطيئا ويعمل بشكل ضعيف. يمنع مؤشر الترابط الذي يقوم بعملية الوصول إلى مؤشرات الترابط الأخرى ، لذلك ، ينتظرون حتى يتم تحرير القفل.
نظرا لأن Vector متزامن ، فإنه يدفع ثمن المزامنة ، مما يجعله بطيئا ويعمل بشكل ضعيف. يمنع مؤشر الترابط الذي يقوم بعملية الوصول إلى مؤشرات الترابط الأخرى ، لذلك ، ينتظرون حتى يتم تحرير القفل.
3) تغيير الحجم
السعة التخزينية لكلتا القائمتين قابلة للتوسيع أو الانقباض ، لقد جعل مصممو Java من الديناميكي الحفاظ على الاستخدام الأمثل للتخزين. ومع ذلك ، لكل منها طريقته الخاصة. ينمو ArrayList بمقدار نصف حجمه بينما يضاعف Vector حجمه الافتراضي. يمكن زيادة سعة ArrayList عن طريق استدعاء الطريقة ensureCapacity().
4) fail-fast
أولا ، دعنا نفهم ما هو الفشل السريع: إذا تم تعديل المجموعة (ArrayList ، Vector ، إلخ) باستثناء عمليات إضافة وإزالة المكرر ، بعد إنشاء المكرر ، سيرفع المكرر استثناء ConcurrentModificationException. يرتبط تغيير البنية بإضافة عناصر أو إزالتها من المجموعة.
Vector ترجع كائن تعداد عن طريق استدعاء elements () < / span> هذا لا يفشل. من ناحية أخرى ، فإن المكرر و ListIterator الذي تم إرجاعه بواسطة ArrayList يفشلان بسرعة.
5) من ينتمي حقا إلى إطار عمل المجموعة؟< / b>
Vector هي واحدة من تلك الفئات التي وصلت مع JDK 1.0 ولم تكن في البداية جزءا من إطار عمل المجموعة ، ولكن في أحدث إصدار تم أخذها في الاعتبار لأنها تنفذ واجهة القائمة ، لذلك ، أصبح جزءا من المجموعة.
تم تقديم إطار عمل ArrayList بعد Vector مع إصدار JDK 1.2. كان ArrayList أكثر تقدما من Vector ولكنه كان يحتوي أيضا على جميع مواصفات Vector. لذلك ، بدأ الأشخاص في استخدام ArrayList بدلا من Vector ، وفي هذه الحالة ، أصبح Vector فئة قديمة.
The تستهلك عمليات المزامنة الكثير من الوقت مقارنة بالعمليات غير المتزامنة ، لذلك ، إذا كان تطبيقك يحتاج إلى التشغيل بشكل أسرع ولا يحتاج إلى مزامنة ، فسيكون ArrayList هو الخيار الصحيح ، من حيث الأداء.
يلخص هذا الجدول الاختلافات ال 5 التي رأيناها:
4) fail-fast
أولا ، دعنا نفهم ما هو الفشل السريع: إذا تم تعديل المجموعة (ArrayList ، Vector ، إلخ) باستثناء عمليات إضافة وإزالة المكرر ، بعد إنشاء المكرر ، سيرفع المكرر استثناء ConcurrentModificationException. يرتبط تغيير البنية بإضافة عناصر أو إزالتها من المجموعة.
Vector ترجع كائن تعداد عن طريق استدعاء elements () < / span> هذا لا يفشل. من ناحية أخرى ، فإن المكرر و ListIterator الذي تم إرجاعه بواسطة ArrayList يفشلان بسرعة.
5) من ينتمي حقا إلى إطار عمل المجموعة؟< / b>
Vector هي واحدة من تلك الفئات التي وصلت مع JDK 1.0 ولم تكن في البداية جزءا من إطار عمل المجموعة ، ولكن في أحدث إصدار تم أخذها في الاعتبار لأنها تنفذ واجهة القائمة ، لذلك ، أصبح جزءا من المجموعة.
تم تقديم إطار عمل ArrayList بعد Vector مع إصدار JDK 1.2. كان ArrayList أكثر تقدما من Vector ولكنه كان يحتوي أيضا على جميع مواصفات Vector. لذلك ، بدأ الأشخاص في استخدام ArrayList بدلا من Vector ، وفي هذه الحالة ، أصبح Vector فئة قديمة.
متى تستخدم Vector و ArrayList؟
يعتمد ذلك على احتياجاتك ، إذا كانت التعليمات البرمجية الخاصة بك تقوم بمزامنة العمليات (مؤشرات الترابط) ، فسيكون Vector هو الخيار الأفضل لأنه يضمن وصول مؤشر ترابط واحد فقط إلى المجموعة في كل مرة.The تستهلك عمليات المزامنة الكثير من الوقت مقارنة بالعمليات غير المتزامنة ، لذلك ، إذا كان تطبيقك يحتاج إلى التشغيل بشكل أسرع ولا يحتاج إلى مزامنة ، فسيكون ArrayList هو الخيار الصحيح ، من حيث الأداء.
يلخص هذا الجدول الاختلافات ال 5 التي رأيناها: