ArrayList
التنفيذ الأساسي هو صفيف ، يتمتع بكفاءة عالية في الوصول إلى العناصر (الاستعلام السريع ، الإدراج البطيء ، تعديل ، وحذف العناصر)
بالمقارنة مع LinkedList ، فهو فعال ، ولكن آمن الخيط.
ArrayList Array عبارة عن صفيف قابل للتبديل يمكنه الوصول إلى جميع العناصر بما في ذلك NULL
يتم التنفيذ الأساسي باستخدام المصفوفات
كائن عابر [] elementData ؛
طريقة البناء
private static int default_capacity = 10 ؛ الكائن النهائي الثابت الخاص [] فارغ _elementData = {} ؛ الكائن النهائي الثابت الخاص [] DefaultCapacity_empty_elementData = {} ؛ كائن عابر [] elementData ؛ private int size ؛ // إنشاء قائمة فارغة ArrayList () {this.elementData = defaultCapacity_empty_elementData ؛ }. } آخر إذا (initialCapacity == 0) {this.elementData = frank_elementData ؛ } آخر {رمي جديد alficalArgumentException ("القدرة غير القانونية:"+ initialCapacity) ؛ }} // إنشاء قائمة بعناصر التجميع المحددة ، والتي يتم ترتيبها بترتيب عودة تكرارية لعناصر الاتصال العامة arraylist (مجموعة <؟ تمتد e> c) {elementData = c.tooarray () ؛ if ((size = elementData.Length)! = 0) {// c.TOarray قد (بشكل غير صحيح) لا إرجاع كائن [] (انظر 6260652) if (elementData.getClass ()! = Object []. } آخر {// استبدال مصفوفة فارغة. this.elementData = فارغ_elementData ؛ }}تخزين
// يتم استبدال العنصر في الموضع المحدد للقائمة بعنصر ، ويتم إرجاع العنصر الأصلي في هذا الموضع مجموعة E العامة (int index ، e element) {rangecheck (index) ؛ // تحقق من سعة الصفيف ورمي: indexOutoFboundSexception e OldValue = elementData (index) ؛ elementData [index] = element ؛ إرجاع Oldvalue ؛ } // إضافة العنصر المحدد في نهاية القائمة Boolean Add (e e) {insureCapacityInternal (size + 1) ؛ // Array expression elementData [size ++] = e ؛ العودة صحيح. } // أضف العنصر في الموضع المحدد للقائمة المنطقية العامة إضافة (e e) {insureCapacityInternal (size ++] = e ؛ return trث SRCPRO: موقف START في صفيف المصدر: صفيف الوجهة ، الوضع المسبق للمصفيف المستهدف ، طول عناصر الصفيف المراد نسخها/ // إضافة العناصر في نهاية القائمة ، والعناصر التي يتم إرجاعها بواسطة addall adeerator connector (Collection <؟ System.arrayCopy (A ، 0 ، elementdata ، numnew) ؛ int numnew = extricted ؛ 0 ؛يقرأ
// قم بإزالة العنصر في الموضع المحدد من هذه القائمة العامة e remove (int index) {rangecheck (index) ؛ modcount ++ ؛ e oldvalue = elementData (index) ؛ int numMoved = size - index - 1 ؛ if (numMoved> 0) system.arrayCopy (elementData ، index+1 ، elementData ، index ، numMoved) ؛ elementData [-size] = null ؛ // واضح للسماح لـ GC بإعادة عملها على OldValue ؛ }. العودة صحيح. }} else {for (int index = 0 ؛ index <size ؛ index ++) if (o.equals (elementData [index])) {fastremove (index) ؛ العودة صحيح. }} إرجاع خطأ ؛ } private void fastremove (int index) {modcount ++ ؛ int numMoved = size - index - 1 ؛ if (numMoved> 0) system.arrayCopy (elementData ، index+1 ، elementData ، index ، numMoved) ؛ elementData [-size] = null ؛ // واضح للسماح لـ GC بعمله}توسع صفيف
كلما تمت إضافة عنصر إلى صفيف ، من الضروري التحقق مما إذا كان عدد العناصر يتجاوز طول الصفيف الحالي بعد إضافة عناصر. إذا تجاوز الطول ، فسيتم توسيع الصفيف لتلبية احتياجات إضافة البيانات.
public void insureCapacity (int mincapacity) {int minexpand = (elementData! = defaultCapacity_empty_elementData)؟ 0: default_capacity ؛ if (mincapacity> minexpand) {supplyExplicitCapacity (mincapacity) ؛ }} private void insureCapacityInternal (int mincapacity) {if (elementData == defaultCapacity_empty_elementData) {minCapacity = math.max (default_capacity ، minicapacity) ؛ } ضمان capticacity (mincapacity) ؛ } private void superexplicitcapacity (int mincapacity) {modcount ++ ؛ // رمز وعي فائض إذا (mincapacity - elementData.Length> 0) تنمو (mincapacity) ؛ } private void تنمو (int mincapacity) {// overflow-concious code int oldcapacity = elementData.Length ؛ int newCapacity = OldCapacity + (OldCapacity >> 1) ؛ if (newCapacity - minicapacity <0) newCapacity = mincapacity ؛ if (newCapacity - max_array_size> 0) newCapacity = hugecapacity (mincapacity) ؛ // عادة ما تكون Mincapacity قريبة من الحجم ، لذلك هذا هو الفوز: elementData = Arrays.copyof (ElementData ، NewCapacity) ؛ } private static int hugeCapacity (int mincapacity) {if (mincapacity <0) // verflow ream new OutofMemoryerror () ؛ العودة (mincapacity> max_array_size)؟ integer.max_value: max_array_size ؛ }arraylist مكتوبة بخط اليد
الفئة العامة myarraylist /*تنفذ قائمة <e>* /{كائن عابر خاص [] elementData ؛ حجم الباحث الخاص ؛ // عدد العناصر العامة myarraylist () {this (10) ؛ } myArrayList public (int initialCapacity) {if (initialCapacity <0) {try {throw new issecent () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} elementData = كائن جديد [initialCapacity] ؛ } حجم int العام () {حجم الإرجاع ؛ } boolean public isempty () {return size == 0 ؛ }. int numMoved = size-index-1 ؛ if (numMoved> 0) {system.arrayCopy (elementData ، index+1 ، elementData ، index ، numMoved) ؛ } elementData [-size] = null ؛ }. } إعادة صواب ؛ } إعادة صواب ؛ }. Object OldValue = elementData [index] ؛ elementData [index] = obj ؛ إرجاع Oldvalue ؛ }. insureCapacity () ؛ System.ArrayCopy (elementData ، index ، elementData ، index+1 ، size-index) ؛ elementData [index] = obj ؛ حجم ++ ؛ } void public add (Object Object) {enterCapacity () ؛ /*elementData [size] = Object ؛ size ++ ؛*/ elementData [size ++] = object ؛ // تعيين القيمة أولاً ، ثم قم بزيادة نفسك} GETSER GET (int index) يلقي الاستثناء {rangecheck (index) ؛ إرجاع elementData [الفهرس] ؛ } public void rangecheck (int index) يلقي الاستثناء {if (index <0 || index> = size) {رمي استثناء جديد () ؛ }} // قم بتوسيع public void insureCapacity () {// artry exply و Content Copy if (size == elementData.length) {// elementData = new Object [size*2+1] ؛ اكتب بهذه الطريقة يتم ضياع المحتوى الموجود في الصفيف الأصلي [] NewArray = كائن جديد [Size*2+1] ؛ // انسخ المحتوى في الصفيف/*لـ (int i = 0 ؛ i <newarray.length ؛ i ++) {newarray [i] = elementData [i] ؛ }*/ system.arraycopy (elementData ، 0 ، Newarray ، 0 ، elementData.Length) ؛ elementData = Newarray ؛ }} // اختبار الفراغ الثابت العام (سلسلة [] args) {myArrayList myArrayList = new MyArrayList (3) ؛ myarraylist.add ("111") ؛ myarraylist.add ("222") ؛ myarraylist.add ("333") ؛ myarraylist.add ("444") ؛ myarraylist.add ("555") ؛ حاول {myArrayList.Remove (2) ؛ myarraylist.add (3 ، "قيمة جديدة") ؛ myArrayList.set (1 ، "تعديل") ؛ } catch (استثناء e1) {// todo catch block e1.printstacktrace () ؛ } system.out.println (myArrayList.size ()) ؛ لـ (int i = 0 ؛ i <myArrayList.size () ؛ i ++) {try {system.out.println (myArrayList.get (i)) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}