อาร์เรย์ความยาวตัวแปร (ไดนามิก) ใน Java


108

ฉันสงสัยว่าจะเริ่มต้นอาร์เรย์จำนวนเต็มอย่างไรให้ขนาดและค่าเปลี่ยนแปลงไปตลอดการทำงานของโปรแกรมของฉันมีข้อเสนอแนะหรือไม่?

คำตอบ:


121

ใช่: ใช้ArrayList

ใน Java อาร์เรย์ "ปกติ" เป็นขนาดคงที่ คุณต้องกำหนดขนาดและไม่สามารถขยายหรือหดได้ ในการเปลี่ยนขนาดคุณต้องสร้างอาร์เรย์ใหม่และคัดลอกข้อมูลที่คุณต้องการซึ่งไม่มีประสิทธิภาพและสร้างความเจ็บปวดให้กับคุณ

โชคดีที่มีคลาสในตัวทุกประเภทที่ใช้โครงสร้างข้อมูลทั่วไปและเครื่องมือที่มีประโยชน์อื่น ๆ ด้วย คุณจะต้องตรวจสอบJava 6 APIเพื่อดูรายการทั้งหมด

ข้อแม้หนึ่งข้อ: ArrayList สามารถเก็บวัตถุได้เท่านั้น (เช่นจำนวนเต็ม) ไม่ใช่แบบดั้งเดิม (เช่น ints) ในกรณีส่วนใหญ่autoboxing / autounboxingจะดูแลเรื่องนี้ให้คุณแบบเงียบ ๆ แต่คุณอาจมีพฤติกรรมแปลก ๆ ขึ้นอยู่กับว่าคุณกำลังทำอะไรอยู่


2
ฉันสงสัยว่าทำไมโค้ดต่อไปนี้ถึงถูกต้องใน java? int[] array = new int[size]; sizeเป็นตัวแปร แต่ต้องแก้ไขความยาวของอาร์เรย์ใช่ไหม @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu ใช่อาร์เรย์จะไม่เปลี่ยนขนาดให้ตรงsizeตามที่โปรแกรมดำเนินการต่อไป มันจะได้ขนาดใดก็ตามที่เกิดขึ้นsizeเมื่อบรรทัดนั้นถูกเรียกใช้งาน
Pops

เมื่อใดก็ตามที่ฉันลบรายการออกจาก ArrayList ฉันจะได้รับnullในตอนท้าย ความคิดใด ๆ ทำไม?
Aaron Franke

37

อาร์เรย์ใน Java มีขนาดคงที่ สิ่งที่คุณต้องการคือ ArrayList ซึ่งเป็นหนึ่งในคอลเลกชันที่มีค่าอย่างยิ่งที่มีอยู่ใน Java

แทน

Integer[] ints = new Integer[x]

คุณใช้

List<Integer> ints = new ArrayList<Integer>();

จากนั้นเพื่อเปลี่ยนรายการที่คุณใช้ints.add(y)และints.remove(z)วิธีการอื่น ๆ ที่มีประโยชน์คุณสามารถพบได้ใน Javadocs ที่เหมาะสม

ฉันขอแนะนำอย่างยิ่งให้ศึกษาคลาส Collections ที่มีอยู่ใน Java เนื่องจากมีประสิทธิภาพมากและมีฟังก์ชันในตัวมากมายที่มือใหม่ Java มักจะพยายามเขียนตัวเองใหม่โดยไม่จำเป็น


ต้องการทำงานจนกว่าฉันจะลอง: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
ทำไมคุณถึงใช้List<Integer>แทนArrayList<Integer>?
Dean Meehan

25

อาร์เรย์เป็นขนาดคงที่เมื่อสร้างอินสแตนซ์ คุณสามารถใช้รายการแทน

Autoboxing ทำให้ List ใช้งานได้คล้ายกับอาร์เรย์คุณสามารถใส่ค่า int ลงไปได้:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
เหตุใดคุณจึงประกาศตัวแปรอ้างอิงประเภท List ไม่ใช่ ArrayList
LppEdd

2
เนื่องจากช่วยให้คุณสามารถสลับระหว่างการใช้งานรายการได้หากจำเป็นคุณจะต้องเปลี่ยน XYZList () ใหม่เท่านั้น หากตัวแปรถูกประกาศเป็น ArrayList oyu อาจใช้วิธีการเฉพาะสำหรับการนำไปใช้งานนี้ทำให้การเปลี่ยนแปลงซับซ้อนมากขึ้น
Mnementh

1
ขอบคุณฉันเข้าใจ
LppEdd

11

ผมไม่เห็นด้วยกับคำตอบก่อนหน้านี้บอกArrayListเพราะArrayListเป็นไม่ได้อาร์เรย์แบบไดนามิก แต่รายการที่ได้รับการสนับสนุนโดยอาร์เรย์ ความแตกต่างคือคุณไม่สามารถทำสิ่งต่อไปนี้ได้:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

มันจะทำให้คุณมี IndexOutOfBoundsException เนื่องจากยังไม่มีองค์ประกอบในตำแหน่งนี้แม้ว่าอาร์เรย์สำรองจะอนุญาตให้มีการเพิ่มดังกล่าว ดังนั้นคุณต้องใช้การใช้งาน Array ที่ขยายได้แบบกำหนดเองตามที่แนะนำโดย @ Randy-lance


ฉันเชื่อว่าคุณต้องการเชื่อมโยงกับcodereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta

ฉันไม่แน่ใจว่า ArrayList มีเมธอด put ตามที่ฉันเห็นในซอร์สโค้ด Java8 หรือไม่ เพียงแค่พยายามค้นหาว่ามันทำงานอย่างไรกับความสามารถที่กำหนด อย่างไรก็ตามพบวิธี ArrayList.add ()
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

ที่มา: วิธีสร้างไดนามิกอาร์เรย์


7
  1. ขอแนะนำให้ใช้รายการเพื่อจัดการกับขนาดที่เล็ก

  2. หากคุณมีตัวเลขจำนวนมากอย่าใช้รายการและกล่องอัตโนมัติ

    แสดงรายการ <จำนวนเต็ม>

สำหรับทุก int เดียวจำนวนเต็มใหม่จะถูกสร้างขึ้นโดยอัตโนมัติ คุณจะพบว่ามันเริ่มช้าลงเมื่อขนาดของรายการเพิ่มขึ้น จำนวนเต็มเหล่านี้เป็นวัตถุที่ไม่จำเป็น ในกรณีนี้ให้ใช้ขนาดโดยประมาณจะดีกว่า

int[] array = new int[ESTIMATED_SIZE];


4

คุณไม่สามารถเปลี่ยนขนาดของอาร์เรย์ อย่างไรก็ตามคุณสามารถสร้างอาร์เรย์ใหม่ที่มีขนาดที่เหมาะสมและคัดลอกข้อมูลจากอาร์เรย์เก่าไปยังอาร์เรย์ใหม่ได้

แต่ตัวเลือกที่ดีที่สุดของคุณคือใช้ IntList จาก jacarta commons ( ที่นี่ )

มันทำงานเหมือนกับ List แต่ใช้พื้นที่น้อยกว่าและมีประสิทธิภาพมากกว่าเพราะเก็บ int แทนการจัดเก็บออบเจ็กต์ Wrapper ไว้เหนือ int (นั่นคือคลาส Integer)


-4

ฉันตอบคำถามนี้และไม่คุณไม่ต้องการอาร์เรย์หรือสิ่งอื่นใดนี่เป็นการมอบหมายงานและฉันทำเสร็จแล้วดังนั้นใช่อาร์เรย์สามารถเพิ่มขนาดได้ นี่คือลิงค์ วิธีใช้ Java Dynamic Array และนี่คือลิงค์สำหรับคำถามของฉันซึ่งฉันตอบ Java Dynamic arrays


1
นี่เป็นเรื่องผิด คำตอบที่เชื่อมโยงเรียก System.arrayCopy () คัดลอกอาร์เรย์เก่าไปยังอาร์เรย์ใหม่ที่มีขนาดเพิ่มขึ้นจากนั้นเพิ่มรายการใหม่ อาร์เรย์ยังไม่สามารถมีขนาดไดนามิกได้
katzenhut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.