126 Stimmen

Java dynamische Array-Größen?

Ich habe eine Klasse - XClass, die ich in ein Array von XClasses laden möchte:

XClass myClass[] = new XClass[10];
myclass[0] = new XClass();
myclass[9] = new XClass();

Ich weiß jedoch nicht, ob ich 10, 8 oder 12 Klassen oder irgendeine andere Anzahl benötigen werde.
Ich werde es erst zur Laufzeit wissen.

Kann ich die Anzahl der Elemente in einem Array während der Laufzeit ändern?
Wenn ja, wie?

0 Stimmen

Ich habe das Format der Frage verbessert, du kannst nur den Titel ändern, wenn du möchtest, sei einfach beschreibend. und willkommen bei Stackoverflow! :D

189voto

cletus Punkte 596503

Nein, du kannst die Größe eines Arrays nach der Erstellung nicht ändern. Du musst es entweder größer als du denkst zuweisen oder den Overhead akzeptieren, wenn es neu zugewiesen werden muss, um zu wachsen. Wenn es das tut, musst du ein neues zuweisen und die Daten von alt nach neu kopieren:

int[] alteItems = new int[10];
for (int i = 0; i < 10; i++) {
    alteItems[i] = i + 10;
}
int[] neueItems = new int[20];
System.arraycopy(alteItems, 0, neueItems, 0, 10);
alteItems = neueItems;

Wenn du dich in dieser Situation wiederfindest, würde ich dringend empfehlen, anstelle von Arrays die Java Collections zu verwenden. Insbesondere ArrayList wickelt im Wesentlichen ein Array ein und kümmert sich um die Logik zum Wachsen des Arrays nach Bedarf:

List meineKlasse = new ArrayList();
meineKlasse.add(new XClass());
meineKlasse.add(new XClass());

Im Allgemeinen ist ein ArrayList aus mehreren Gründen eine bevorzugte Lösung gegenüber einem Array. Zum einen sind Arrays veränderbar. Wenn du eine Klasse hast, die das macht:

Klasse MeineKlasse {
    private int[] items;

    public int[] getItems() {
        return items;
    }
}

dann hast du ein Problem erstellt, da ein Aufrufer dein privates Datenmitglied ändern kann, was zu allen möglichen defensiven Kopien führt. Vergleiche das mit der Listen-Version:

Klasse MeineKlasse {
    private List items;

    public List getItems() {
        return Collections.unmodifiableList(items);
    }
}

31voto

OscarRyz Punkte 189898

In java die Arraylänge ist fest.

Sie können eine Liste verwenden, um die Werte zu halten und die toArray Methode aufrufen, wenn benötigt. Siehe das folgende Beispiel:

import java.util.List;
import java.util.ArrayList;
import java.util.Random;

public class A  {

    public static void main( String [] args ) {
        // Dynamisch Instanzen halten
        List list = new ArrayList();

        // Fülle es mit einer zufälligen Zahl zwischen 0 und 100
        int elemente = new Random().nextInt(100);  
        for( int i = 0 ; i < elemente ; i++ ) {
            list.add( new xClass() );
        }

        // Konvertiere es zu einem Array
        xClass [] array = list.toArray( new xClass[ list.size() ] );

        System.out.println( "Größe des Arrays = " + array.length );
    }
}
class xClass {}

9voto

Stephen C Punkte 665668

Wie andere bereits gesagt haben, kann die Größe eines vorhandenen Java-Arrays nicht geändert werden.

ArrayList ist das, was standardmäßiges Java am nächsten an einem dynamisch dimensionierten Array hat. Es gibt jedoch einige Dinge über ArrayList (eigentlich die List-Schnittstelle), die nicht "array-ähnlich" sind. Zum Beispiel:

  • Sie können [ ... ] nicht verwenden, um auf eine Liste zuzugreifen. Sie müssen die Methoden get(int) und set(int, E) verwenden.
  • Ein ArrayList wird mit null Elementen erstellt. Sie können nicht einfach ein ArrayList mit 20 Elementen erstellen und dann set(15, foo) aufrufen.
  • Sie können die Größe eines ArrayList nicht direkt ändern. Dies erfolgt indirekt mit den verschiedenen Methoden add, insert und remove.

Wenn Sie etwas mehr array-ähnliches möchten, müssen Sie Ihre eigene API entwerfen. (Vielleicht könnte jemand mit einer vorhandenen Third-Party-Bibliothek einspringen ... Ich konnte in 2 Minuten "Recherche" mit Google keine finden :-) )

Wenn Sie nur ein Array benötigen, das wächst, während Sie es initialisieren, dann ist die Lösung etwas wie diese.

ArrayList tmp = new ArrayList();
while (...) {
   tmp.add(new T(...));
}
// Dies erstellt ein neues Array und kopiert die Elemente von 'tmp' dorthin.
T[] array = tmp.toArray(new T[tmp.size()]);

7voto

newacct Punkte 114757

Sie setzen die Anzahl der Elemente auf alles, was Sie wollen, wenn Sie es erstellen:

xClass[] mysclass = new xClass[n];

Dann können Sie die Elemente in einer Schleife initialisieren. Ich vermute, dass dies ist, was Sie brauchen.

Wenn Sie Elemente zum Array hinzufügen oder entfernen müssen, nachdem Sie es erstellt haben, müssten Sie ein ArrayList verwenden.

6voto

Pascal9x Punkte 320

Sie können ArrayList verwenden:

import java.util.ArrayList;
import java.util.Iterator;

...

ArrayList arr = new ArrayList();
arr.add("neo");
arr.add("morpheus");
arr.add("trinity");
Iterator foreach = arr.iterator();
while (foreach.hasNext()) System.out.println(foreach.next());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X