บทความนี้ส่วนใหญ่ศึกษาเนื้อหาที่เกี่ยวข้องกับตัวอย่างปัญหาการขยายตัวของ Java Arraylist ดังต่อไปนี้
ก่อนอื่นเราจำเป็นต้องรู้ว่าสาระสำคัญของ ArrayList นั้นเป็นอาร์เรย์ประเภทวัตถุ ปัญหาการขยายตัวของ ArrayList เป็นปัญหาการขยายตัวของอาร์เรย์ประเภทวัตถุนี้
วัตถุชั่วคราว [] ElementData;
มีสามสถานการณ์สำหรับการสร้าง ArrayList
arraylist al = new ArrayList ();
หลังจากการสร้างเสร็จสมบูรณ์ความสามารถของ AL คือ 0 คุณสามารถรู้ได้จากรหัสต่อไปนี้
วัตถุชั่วคราว [] ElementData; วัตถุสุดท้ายคงที่ส่วนตัว [] defaultcapacity_empty_elementdata = {}; arraylist สาธารณะ () {this.elementData = defaultCapacity_ElementData;}arraylist al = new ArrayList (5);
การสร้างวัตถุ ArrayList ที่มีความจุ 5 เป็นอาร์เรย์วัตถุที่มีความยาว 5 คุณสามารถรู้ได้จากรหัสต่อไปนี้
วัตถุชั่วคราว [] ElementData; วัตถุสุดท้ายแบบคงที่ส่วนตัว [] defaultCapacity_empty_elementData = {}; arrayList สาธารณะ (int initialCapacity) {ถ้า (initialCapacity> 0) {this.elementData = วัตถุใหม่ [เริ่มต้น]; } อื่นถ้า (initialCapacity == 0) {this.elementData = emport_elementData; } else {โยน ungloralargumentException ใหม่ ("ความสามารถที่ผิดกฎหมาย:"+ initialcapacity); -arraylist al = new ArrayList <integer> (array.aslist (1, 2, 3, 4, 5));
วัตถุ ArrayList ถูกสร้างขึ้นด้านบนและเริ่มต้นโดยใช้รายการเป็น [1,2,3,4,5] ในความเป็นจริงมันสร้างอาร์เรย์วัตถุที่มีความยาว 5 และเนื้อหาของอาร์เรย์คือ [1, 2, 3, 4, 5] คุณสามารถรู้ได้จากรหัสต่อไปนี้
ขนาด int ส่วนตัววัตถุชั่วคราว [] elementData; วัตถุสุดท้ายคงที่ส่วนตัว [] defaultCapacity_EMPTY_ELEMENTDATA = {}; 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; - ArrayList <Integer> คอลเลกชัน = new ArrayList <Integer> (array.aslist (1, 2, 3, 4, 5)); จำนวนเต็ม [] moreints = {6, 7, 8, 9, 10}; collection.addall (array.aslist (moreints)); 1. สร้าง ArrayList ที่มีขนาด 5 พร้อมเนื้อหา [1, 2, 3, 4, 5] - ความจุเริ่มต้นคือ 5
2. เพิ่มชุด {6, 7, 8, 9, 10} ลงในวัตถุ ArrayList นี้ ---- ในเวลานี้ความสามารถของวัตถุ ArrayList นี้จะต้องขยาย
Public Boolean Addall (คอลเลกชัน <? ขยาย e> c) {// รับวัตถุแทรกอาร์เรย์ [] a = c.toarray (); // รับความยาวเนื้อหาแทรก int numnew = a.length; ensureCapacityInternal (ขนาด + numnew); 0;} โมฆะส่วนตัว ensureCapacityInternal (int mincapacity) {// ถ้าเนื้อหาใน arrayList ว่างเปล่าถ้า (elementData == defaultCapacity_exty_ElementData) {mincapacity = math.max (default_capacity, mincapacity); mincapacity) {modcount ++; // เพิ่มเติมคำนวณขนาดที่ขยายตัว mincapacityif (mincapacity - elementData.length> 0) เติบโต (mincapacity);} โมฆะส่วนตัวเติบโต (int mincapacity) {// ขนาดดั้งเดิม int newCapacity = oldCapacity + (ความเป็นไปได้ >> 1); // เปรียบเทียบกับความยาวการขยายตัวที่คำนวณได้ก่อนหน้านี้ mincapacity ใช้เวลาที่ใหญ่กว่าเป็นความยาวการขยายตัวถ้า (newcapacity - mincapacity <0) newcapacity = mincapacity; Hugecapacity (mincapacity); // expansion elementData = arrays.copyof (elementData, newcapacity);} ส่วนตัวคงที่ int int hugecapacity (int mincapacity) {// mincapacity น้อยกว่า 0) outofMemoryError (); return (mincapacity> max_array_size)? Integer.max_value: max_array_size;} 1. ขนาดดั้งเดิมของ arraylist + ขนาดของคอลเลกชันที่จะแทรก numnew = รับความยาวขั้นต่ำของ mincapacity arraylist ที่ขยายตัว
2. หากขนาดดั้งเดิมของ ArrayList คือ 0 นั่นคือ ArrayList ว่างเปล่าความยาวต่ำสุดของ ArrayList หลังจากการขยาย mincapacity = math.max (10, mincapacity) นั่นคือความยาวต่ำสุดของการขยายตัวไม่ได้เป็นเพียงขนาดความยาวดั้งเดิม
3. ความยาวต่ำสุดที่เพิ่มขึ้นที่ได้รับข้างต้นไม่ใช่ความยาวที่ขยายตัวสุดท้ายและจำเป็นต้องมีการคำนวณเพิ่มเติม
(1) รับขนาดดั้งเดิมของ arraylist oldcapacity
(2) รับขนาดที่ขยายใหม่: newCapacity = oldCapacity*1.5;
(3) เปรียบเทียบ mincapacity ความยาวต่ำสุดที่ขยายการคำนวณด้านบนกับขนาดที่เพิ่มขึ้นใหม่ที่ได้รับที่นี่และใช้ขนาดใหญ่ขึ้นเป็นขนาดที่ขยายตัวสุดท้าย
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของตัวอย่างปัญหาการขยายตัวของ ArrayList ในบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!