يدرس هذه المقالة بشكل رئيسي محتويات مشكلة توسيع Java ArrayList ، على النحو التالي.
بادئ ذي بدء ، نحن بحاجة إلى معرفة أن جوهر ArrayList هو في الواقع صفيف من نوع الكائن. مشكلة التوسع في ArrayList هي في الواقع مشكلة التوسع في مجموعة نوع الكائن هذه.
كائن عابر [] elementData ؛
هناك ثلاث حالات لإنشاء قائمة ArrayList
ArrayList al = new ArrayList () ؛
بعد الانتهاء من الإنشاء ، تكون قدرة Al هي 0. يمكنك معرفة الكود التالي.
كائن عابر [] elementData ؛ كائن نهائي ثابت خاص [] DefaultCapacity_empty_elementData = {} ؛ ArrayList () {this.elementData = defaultCapacity_empty_elementdata ؛}ArrayList al = new ArrayList (5) ؛
يعد إنشاء كائن ArrayList بسعة 5 صفيفًا كائنًا بطول 5. يمكنك أن تعرف من الكود التالي.
كائن عابر [] elementData ؛ الكائن النهائي الثابت الخاص [] DefaultCapacity_empty_elementData = {} ؛ ArrayList public (int initialCapacity) {if (initialCapacity> 0) {this.elementData = new Object [initialCapacity] ؛ } آخر إذا (initialCapacity == 0) {this.elementData = frank_elementData ؛ } آخر {رمي جديد alficalArgumentException ("القدرة غير القانونية:"+ initialCapacity) ؛ }}ArrayList al = new ArrayList <integer> (Arrays.aslist (1 ، 2 ، 3 ، 4 ، 5)) ؛
يتم إنشاء كائن ArrayList أعلاه وتهيئته باستخدام قائمة مثل [1،2،3،4،5]. في الواقع ، فإنه ينشئ مجموعة كائن بطول 5 ، ومحتوى الصفيف هو [1 ، 2 ، 3 ، 4 ، 5]. يمكنك أن تعرف من الكود التالي.
حجم int الخاص ؛ كائن عابر [] elementData ؛ الكائن النهائي الثابت الخاص [] DefaultCapacity_empty_elementData = {} ؛ ArrayList Public (Collection <؟ Extends e> c) {elementData = C.Toarray () ؛ if ((size = elementData.Length)! = 0) {// c.TOarray قد (بشكل غير صحيح) لا إرجاع كائن [] (انظر 6260652) if (elementData.getClass ()! = Object []. } آخر {// استبدال مصفوفة فارغة. this.elementData = فارغ_elementData ؛ }} ArrayList <integer> collection = new ArrayList <integer> (Arrays.aslist (1 ، 2 ، 3 ، 4 ، 5)) ؛ integer [] moreints = {6 ، 7 ، 8 ، 9 ، 10} ؛ collection.addall (arrays.aslist (moreints)) ؛ 1. قم بإنشاء قائمة ArrayList بحجم 5 ، مع المحتوى [1 ، 2 ، 3 ، 4 ، 5]. - السعة الأولية هي 5
2. أضف مجموعة {6 ، 7 ، 8 ، 9 ، 10} إلى كائن arraylist. ---- في هذا الوقت ، يجب توسيع قدرة كائن ArrayList.
addall boolean العامة (مجموعة <؟ تمتد e> c) {// احصل على كائن صفيف الإدراج [] a = c.toarray () ؛ // احصل على طول محتوى insert int numNew = A.Length ؛ insureCapacityInternal (size + numNew) ؛ 0 ؛} private void insureCapacityInternal (int mincapacity) {// إذا كان المحتوى الموجود في arraylist فارغًا إذا كان (elementData == defaultCapacity_empty_elementdata) {mincapacity = math.max (default_capacity ، minicapacity) ؛}}} {modcount ++ ؛ // أيضًا ، قم بحساب الحجم الموسع mincapacityif (minicapacity - elementData.Length> 0) تنمو (mincapacity) ؛} تنمو الفراغ الخاص (int mincapacity) {// الحجم الأصلي من الحجم الأصلي لـ int intedcait = elementData.Luction OldCapacity + (OldCapacity >> 1) ؛ // قارن مع طول طول التمدد المحسوب مسبقًا ، خذ طولًا أكبر كطول تمدد إذا (newCapacity - minicapacity <0) newCapacity = minCapacity ؛ elementData = arrays.copyof (elementData ، newCapacity) ؛} private static int hugecapacity (int mincapacity) {// mincapacity أقل من 0 ، مما يشير ؟ integer.max_value: max_array_size ؛} 1. الحجم الأصلي لـ ArrayList + حجم المجموعة المراد إدراج
2. إذا كان الحجم الأصلي لـ ArrayList هو 0 ، أي أن ArrayList فارغ ، والحد الأدنى لطول قائمة ArrayList بعد التوسع Mincapacity = Math.Max (10 ، Mincapacity) ، أي الحد الأدنى لطول الطول المفرط ليس فقط حجم الطول الأصلي بالإضافة إلى عدد الطول من مجموعة الإدراج.
3. الحد الأدنى للطول الموسع الذي تم الحصول عليه أعلاه ليس الطول النهائي الموسع ، وهناك حاجة إلى مزيد من الحساب.
(1) احصل على الحجم الأصلي لـ ArrayList OldCapacity
(2) الحصول على الحجم الموسع الجديد: NewCapacity = OldCapacity*1.5 ؛
(3) قارن الحد الأدنى للطول الموسع المحسوب أعلاه مع الحجم الموسع الجديد الذي تم الحصول عليه هنا ، واتخذ أكبر حجم كحجم موسع نهائي.
ما سبق هو كل التفسير المفصل لمثال مشكلة توسيع ArrayList في هذه المقالة ، آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!