ผู้เข้าร่วมงาน
การใช้งานพื้นฐานเป็นอาร์เรย์ซึ่งมีประสิทธิภาพสูงในการเข้าถึงองค์ประกอบ (แบบสอบถามที่รวดเร็วการแทรกช้าการปรับเปลี่ยนและการลบองค์ประกอบ)
เมื่อเทียบกับ LinkedList นั้นมีประสิทธิภาพ แต่มีความปลอดภัย
ArrayList Array เป็นอาร์เรย์ที่ไม่แน่นอนซึ่งสามารถเข้าถึงองค์ประกอบทั้งหมดรวมถึง NULL
การใช้งานพื้นฐานจะดำเนินการโดยใช้อาร์เรย์
วัตถุชั่วคราว [] ElementData;
วิธีการก่อสร้าง
ส่วนตัวคงที่ int default_capacity = 10; วัตถุสุดท้ายคงที่ส่วนตัว [] emport_elementData = {}; วัตถุสุดท้ายคงที่ส่วนตัว [] defaultCapacity_empty_elementData = {}; วัตถุชั่วคราว [] elementData; ขนาด int ส่วนตัว; // สร้างรายการที่ว่างเปล่า arraylist () {this.elementData = defaultCapacity_EMPTY_ELEMENTDATA; } // สร้างรายการว่างของความจุเริ่มต้นที่ระบุ arraylist (int initialCapacity) {ถ้า (initialCapacity> 0) {this.elementData = วัตถุใหม่ [เริ่มต้นความจุ]; } อื่นถ้า (initialCapacity == 0) {this.elementData = emport_elementData; } else {โยน ungloralargumentException ใหม่ ("ความสามารถที่ผิดกฎหมาย:"+ initialcapacity); }} // สร้างรายการองค์ประกอบการรวบรวมที่ระบุซึ่งจัดเรียงตามลำดับของการส่งคืนซ้ำขององค์ประกอบการเชื่อมต่อ public arraylist (คอลเลกชัน <? ขยาย e> c) {elementData = c.toarray (); if ((size = elementData.length)! = 0) {// c.toarray อาจ (ไม่ถูกต้อง) ไม่ส่งคืนวัตถุ [] (ดู 6260652) ถ้า (elementData.getClass ()! = object []. class) elementData = array.copyof } else {// แทนที่ด้วยอาร์เรย์ที่ว่างเปล่า this.elementData = emport_elementData; -พื้นที่จัดเก็บ
// องค์ประกอบที่ตำแหน่งที่ระบุของรายการจะถูกแทนที่ด้วยองค์ประกอบและองค์ประกอบดั้งเดิมที่ตำแหน่งนั้นจะถูกส่งคืนสาธารณะ E Set (INT INDEX, E Element) {RangeCheck (ดัชนี); // ตรวจสอบความจุอาร์เรย์และการโยน: indexoutofboundsexception e oldValue = elementData (ดัชนี); ElementData [ดัชนี] = องค์ประกอบ; กลับ OldValue; } // เพิ่มองค์ประกอบที่ระบุในตอนท้ายของรายการบูลีนสาธารณะเพิ่ม (e e) {ensureCapacityInternal (ขนาด + 1); // การขยายอาร์เรย์ ElementData [ขนาด ++] = e; กลับมาจริง; } // เพิ่มองค์ประกอบที่ตำแหน่งที่ระบุของรายการบูลีนสาธารณะเพิ่ม (e e) {enureCapacityInternal (ขนาด ++] = e; return true;} // เพิ่มองค์ประกอบที่ตำแหน่งที่ระบุของรายการโมฆะสาธารณะ SRCPRO: ตำแหน่งเริ่มต้นในอาร์เรย์ต้นทาง // dest: array ปลายทาง, destpost: ตำแหน่งเริ่มต้นของอาร์เรย์เป้าหมาย, ความยาว: จำนวนขององค์ประกอบอาเรย์ที่จะคัดลอก // ย้ายองค์ประกอบที่อยู่ในปัจจุบัน // เพิ่มองค์ประกอบในการเชื่อมต่อที่ส่วนท้ายของรายการและองค์ประกอบอยู่ในคำสั่งที่ส่งคืนโดยการเชื่อมต่อบูลีนสาธารณะ (คอลเลกชัน <? ขยาย e> c) {วัตถุ [] a = c.toarray (); System.arraycopy (A, 0, ElementData, ขนาด, numnew); int numnew = A.Length; 0;}อ่าน
// ลบองค์ประกอบที่ตำแหน่งที่ระบุของรายการสาธารณะ e ลบ (ดัชนี int) {rangecheck (ดัชนี); Modcount ++; E oldValue = ElementData (ดัชนี); int nummoved = size - ดัชนี - 1; if (nummoved> 0) system.arraycopy (elementData, ดัชนี+1, elementData, ดัชนี, nummoved); ElementData [-size] = null; // เคลียร์เพื่อให้ GC ทำงานให้กับ OldValue; } // ลบองค์ประกอบในรายการบูลีนสาธารณะลบ (วัตถุ o) {ถ้า (o == null) {สำหรับ (int index = 0; index <size; index ++) ถ้า (ElementData [index] == null) {fastremove (ดัชนี); กลับมาจริง; }} else {สำหรับ (int index = 0; index <size; index ++) ถ้า (o.equals (elementData [index])) {fastremove (ดัชนี); กลับมาจริง; }} return false; } โมฆะส่วนตัว fastremove (ดัชนี int) {modcount ++; int nummoved = size - ดัชนี - 1; if (nummoved> 0) system.arraycopy (elementData, ดัชนี+1, elementData, ดัชนี, nummoved); ElementData [-size] = null; // ชัดเจนเพื่อให้ GC ทำงาน}การขยายตัวของอาร์เรย์
เมื่อใดก็ตามที่มีการเพิ่มองค์ประกอบลงในอาร์เรย์จะต้องตรวจสอบว่าจำนวนองค์ประกอบเกินความยาวของอาร์เรย์ปัจจุบันหลังจากเพิ่มองค์ประกอบหรือไม่ หากเกินความยาวอาร์เรย์จะถูกขยายเพื่อตอบสนองความต้องการในการเพิ่มข้อมูล
โมฆะสาธารณะ ensureCapacity (int mincapacity) {int minexpand = (elementData! = defaultCapacity_EMPTY_ELEMENTDATA)? 0: default_capacity; if (mincapacity> minexpand) {ensureexplicitCapacity (mincapacity); }} โมฆะส่วนตัว ensureCapacityInternal (int mincapacity) {ถ้า (elementData == defaultCapacity_empty_elementData) {mincapacity = math.max (default_capacity, mincapacity); } ensureeExplicitCapacity (mincapacity); } โมฆะส่วนตัว ensureexplicitCapacity (int mincapacity) {modcount ++; // รหัสที่ใส่ใจล้นถ้า (mincapacity - elementData.length> 0) เติบโต (mincapacity); } โมฆะส่วนตัว Grow (int mincapacity) {// รหัสผ่านไหลล้น int oldcapacity = elementData.length; int newCapacity = oldCapacity + (oldcapacity >> 1); if (newCapacity - mincapacity <0) newCapacity = mincapacity; if (newCapacity - max_array_size> 0) newcapacity = hugecapacity (mincapacity); // mincapacity มักจะใกล้เคียงกับขนาดดังนั้นนี่คือการชนะ: elementData = arrays.copyof (ElementData, newCapacity); } private static int hugecapacity (int mincapacity) {ถ้า (mincapacity <0) // overflow โยน outofMemoryError ใหม่ (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size; -ArrayList ที่เขียนด้วยลายมือ
คลาสสาธารณะ myarrayList /*ใช้รายการ <e>* /{วัตถุชั่วคราวส่วนตัว [] elementData; ขนาด int ส่วนตัว; // จำนวนองค์ประกอบสาธารณะ myarraylist () {this (10); } public myarrayList (int initialCapacity) {if (initialCapacity <0) {ลอง {โยนข้อยกเว้นใหม่ (); } catch (exception e) {e.printstacktrace (); }} elementData = วัตถุใหม่ [initialCapacity]; } ขนาด int สาธารณะ () {ขนาดคืน; } บูลีนสาธารณะ isempty () {ขนาดคืน == 0; } // ลบวัตถุตามดัชนีโมฆะสาธารณะลบ (ดัชนี int) โยนข้อยกเว้น {rangecheck (ดัชนี); int nummoved = size-index-1; if (nummoved> 0) {system.arraycopy (elementData, index+1, elementData, index, nummoved); } elementData [-size] = null; } // ลบวัตถุบูลีนสาธารณะลบ (Object obj) โยนข้อยกเว้น {สำหรับ (int i = 0; i <size; i ++) {ถ้า (รับ (i) .equals (obj)) {ลบ (i); } return true; } return true; } // แก้ไขชุดวัตถุสาธารณะองค์ประกอบ (INT ดัชนี, Object OBJ) โยนข้อยกเว้น {RangeCheck (ดัชนี); Object OldValue = ElementData [ดัชนี]; ElementData [ดัชนี] = OBJ; กลับ OldValue; } // แทรกองค์ประกอบที่ตำแหน่งที่ระบุโมฆะสาธารณะเพิ่ม (ดัชนี int, object obj) โยนข้อยกเว้น {rangecheck (ดัชนี); ensurecapacity (); System.arrayCopy (ElementData, INDEX, ElementData, ดัชนี+1, Size-Index); ElementData [ดัชนี] = OBJ; ขนาด ++; } โมฆะสาธารณะเพิ่ม (วัตถุวัตถุ) {ensureCapacity (); /*elementData [ขนาด] = วัตถุ; ขนาด ++;*/ elementData [ขนาด ++] = วัตถุ; // กำหนดค่าก่อนจากนั้นเพิ่มตัวคุณเอง} วัตถุสาธารณะรับ (ดัชนี int) โยนข้อยกเว้น {RangeCheck (ดัชนี); return elementData [ดัชนี]; } โมฆะสาธารณะ RangeCheck (INT ดัชนี) โยนข้อยกเว้น {ถ้า (ดัชนี <0 || ดัชนี> = ขนาด) {โยนข้อยกเว้นใหม่ (); }} // ขยายโมฆะสาธารณะ enureCapacity () {// การขยายอาร์เรย์และการคัดลอกเนื้อหาถ้า (ขนาด == elementData.length) {// elementData = วัตถุใหม่ [ขนาด*2+1]; เขียนด้วยวิธีนี้เนื้อหาในอาร์เรย์ดั้งเดิมจะหายไปวัตถุ [] newArray = วัตถุใหม่ [ขนาด*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 = 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 (Exception e1) {// todo บล็อก catch ที่สร้างอัตโนมัติ e1.printstacktrace (); } system.out.println (myarraylist.size ()); สำหรับ (int i = 0; i <myarraylist.size (); i ++) {ลอง {system.out.println (myarraylist.get.get (i)); } catch (exception e) {e.printstacktrace (); -