Arrays mit variabler Länge (dynamisch) in Java

108

Ich habe mich gefragt, wie ich ein Integer-Array so initialisieren kann, dass sich Größe und Werte während der Ausführung meines Programms ändern. Irgendwelche Vorschläge?

Mohammad Sepahvand
quelle

Antworten:

121

Ja: Verwenden Sie ArrayList .

In Java haben "normale" Arrays eine feste Größe. Sie müssen ihnen eine Größe geben und können sie nicht erweitern oder verkleinern. Um die Größe zu ändern, müssen Sie ein neues Array erstellen und die gewünschten Daten kopieren - was ineffizient und für Sie schmerzhaft ist.

Glücklicherweise gibt es alle Arten von integrierten Klassen, die gemeinsame Datenstrukturen implementieren, sowie andere nützliche Tools. Sie sollten die Java 6-API auf eine vollständige Liste überprüfen .

Eine Einschränkung: ArrayList kann nur Objekte (z. B. Ganzzahlen) enthalten, keine Grundelemente (z. B. Ints). In den meisten Fällen erledigt Autoboxing / Autounboxing dies stillschweigend für Sie, aber je nachdem, was Sie tun, kann es zu seltsamen Verhaltensweisen kommen.

Pops
quelle
2
Ich frage mich, warum der folgende Code in Java richtig ist. int[] array = new int[size]; sizeist eine Variable, aber die Länge eines Arrays muss festgelegt werden, stimmt's? @Lord Torgamus
jerry_sjtu
12
@jerry_sjtu Ja, das Array ändert seine Größe im Laufe sizedes Programms nicht entsprechend. Es erhält die Größe, in der es sich gerade befindet, sizewenn diese Zeile ausgeführt wird.
Pops
Immer wenn ich ein Element aus einer ArrayList entferne, wird am Ende ein angezeigt null. Irgendwelche Ideen warum?
Aaron Franke
37

Arrays in Java haben eine feste Größe. Was Sie brauchen, ist eine ArrayList, eine von mehreren äußerst wertvollen Sammlungen, die in Java verfügbar sind.

Anstatt

Integer[] ints = new Integer[x]

Sie nutzen

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

Um dann die von Ihnen verwendete Liste ints.add(y)und ints.remove(z)viele andere nützliche Methoden zu ändern, finden Sie diese in den entsprechenden Javadocs.

Ich empfehle dringend, die in Java verfügbaren Collections-Klassen zu studieren, da sie sehr leistungsfähig sind und Ihnen viele integrierte Funktionen bieten, die Java-Neulinge normalerweise unnötig neu zu schreiben versuchen.

MattGrommes
quelle
Ich möchte arbeiten, bis ich es versucht habe: List <Integer> ints = new ArrayList <Integer> ();
Gorbysbm
5
Warum benutzt du List<Integer>statt ArrayList<Integer>?
Dean Meehan
24

Arrays haben nach der Instanziierung eine feste Größe. Sie können stattdessen eine Liste verwenden.

Autoboxing macht eine Liste ähnlich wie ein Array nutzbar. Sie können einfach int-Werte einfügen:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Mnementh
quelle
2
Warum deklarieren Sie eine Referenzvariable vom Typ List und nicht ArrayList?
LppEdd
2
Da Sie bei Bedarf einfach zwischen Listenimplementierungen wechseln können, müssen Sie nur die neue XYZList () ändern. Wenn die Variable als ArrayList deklariert ist, verwendet oyu möglicherweise Methoden, die für diese Implementierung spezifisch sind, was eine Änderung komplizierter macht.
Mnementh
1
Danke, ich verstehe.
LppEdd
11

Ich bin mit den vorherigen Antworten nicht einverstanden ArrayList, da ArrayListes sich nicht um ein dynamisches Array handelt, sondern um eine Liste, die von einem Array unterstützt wird. Der Unterschied besteht darin, dass Sie Folgendes nicht tun können:

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

Sie erhalten eine IndexOutOfBoundsException, da sich an dieser Position noch kein Element befindet, obwohl das Hintergrundarray eine solche Hinzufügung zulassen würde. Sie müssen also eine benutzerdefinierte erweiterbare Array-Implementierung verwenden, wie von @ randy-lance vorgeschlagen

cspann
quelle
Ich glaube, Sie wollten es mit codereply.com/answer/6i5bur/java-dynamic-arrays.html verknüpfen
Amit Kumar Gupta
Ich bin nicht sicher, ob ArrayList eine Put-Methode hat, wie ich im Java8-Quellcode sehe. Ich versuche nur herauszufinden, wie es sich bei gegebener Kapazität verhält. Es wurde jedoch die ArrayList.add () -Methode gefunden.
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]);
}    
}

}

Quelle: So erstellen Sie ein dynamisches Array

Anuj Dhiman
quelle
7
  1. Es wird empfohlen, List zu verwenden, um mit kleinen Größen umzugehen.

  2. Wenn Sie eine große Anzahl von Nummern haben, verwenden Sie NIEMALS List und Autoboxing.

    Liste <Integer> Liste

Für jedes einzelne Int wird automatisch eine neue Ganzzahl erstellt. Sie werden feststellen, dass es langsam wird, wenn die Liste größer wird. Diese Ganzzahlen sind unnötige Objekte. In diesem Fall wäre es besser, eine geschätzte Größe zu verwenden.

int[] array = new int[ESTIMATED_SIZE];
Hao Deng
quelle
4

Wie wäre es Liststattdessen mit einem ? Beispielsweise,ArrayList<integer>

Konrad Garus
quelle
4

Sie können die Größe eines Arrays nicht ändern. Sie können jedoch ein neues Array mit der richtigen Größe erstellen und die Daten vom alten Array in das neue kopieren.

Am besten verwenden Sie jedoch IntList von jacarta commons. ( hier )

Es funktioniert genau wie eine Liste, benötigt jedoch weniger Speicherplatz und ist effizienter, da es Ints speichert, anstatt Wrapper-Objekte über Ints zu speichern (das ist die Integer-Klasse).

Thiago Chaves
quelle
-4

Ich habe diese Frage beantwortet und nein, Sie brauchen keine Arrayliste oder etwas anderes. Dies war eine Aufgabe und ich habe sie abgeschlossen, damit sich die Arrays vergrößern können. Hier ist der Link Wie man Java Dynamic Array benutzt und hier ist der Link für meine Frage, die ich mit Java Dynamic Arrays beantwortet habe

Niemand
quelle
1
das ist einfach falsch. Die verknüpfte Antwort ruft System.arrayCopy () auf, kopiert das alte Array in ein neues mit größerer Größe und fügt dann den neuen Eintrag hinzu. Arrays können immer noch keine dynamische Größe haben.
Katzenhut