Array von Objekten in Java

⚡ Intelligente Zusammenfassung

Array von Objekten in Java Speichert Objektverweise in einem zusammenhängenden Speicherbereich fester Größe, sodass eine einzelne Variable viele Instanzen einer Klasse aufnehmen und jede einzelne über einen Index für Iteration, Mutation und Übergabe an Methoden aufgerufen werden kann.

  • 📦 Referenzspeicher: Jeder Steckplatz in einem Java Ein Array von Objekten enthält eine Referenz auf ein Objekt, nicht das Objekt selbst, ähnlich wie jede Objektvariable in Java.
  • 🧱 Zweistufige Erstellung: Erstelle ein Array mit new ClassName[size], und erstelle dann jedes Objekt mit new ClassName(), bevor du Methoden darauf aufrufst.
  • ⚠️ NullPointerException: Jeder Slot beginnt als null. Der Aufruf einer Methode auf einem nicht initialisierten Slot löst zur Laufzeit eine NullPointerException aus.
  • 🔁 Wiederholung: Verwenden Sie eine for-Schleife mit Arraylänge oder eine erweiterte for-Schleife, um jedes Objekt im Array zu durchlaufen.
  • 📏 Feste Größe: Ein Array kann nach der Zuweisung nicht mehr vergrößert werden. Verwenden Sie ArrayList, wenn sich die Anzahl der Objekte zur Laufzeit ändert.
  • ???? ️ Konstruktorinitialisierung: Konstruktoren, die während der Erstellung direkt übergeben werden, ermöglichen eine kürzere und sicherere Einrichtung als nachträgliche Setter-Aufrufe.
  • 🚚 Methodenparameter: Durch die Übergabe des Arrays an eine Methode wird eine Referenz übertragen, sodass Änderungen innerhalb der Methode für den Aufrufer sichtbar sind.

Array von Objekten in Java

Was ist ein Array von Objekten in Java?

A Java Array von Objekten Speichert mehrere Objektinstanzen derselben Klasse in einem einzigen Container fester Größe. Im Gegensatz zu einem primitiven Array, das Werte wie speichert int, doubleden boolean direkt in jedem Slot, ein Array von Objekten speichert ReferenzenJeder Slot verweist auf die Speicheradresse eines Objekts, und das Objekt selbst befindet sich im Speicher. Java Haufen.

Dieses Layout entspricht der Vorgehensweise bei jedem Objekt. Variable in Java Es funktioniert. Ein Array gruppiert einfach mehrere Objektverweise, sodass man über ihren Index darauf zugreifen kann. Es ist die naheliegende Wahl, wenn die Anzahl der Objekte von vornherein bekannt ist und sich während der Programmlaufzeit nicht ändert.

Syntax

ClassName[] obj = new ClassName[array_length];

Die rechte Seite weist Platz zu für array_length Referenzen, alle initialisiert auf nullKein Objekt von ClassName Es existiert bisher nur der Container, der Verweise auf solche Objekte enthalten kann.

Wie man ein Array von Objekten erstellt in Java

Das Erstellen eines Arbeitsarrays von Objekten erfordert immer zwei Speicherzuweisungsschritte. Im ersten Schritt wird der Referenzcontainer zugewiesen, im zweiten Schritt jedes Objekt, auf das der Container verweisen soll. Überspringenping Der zweite Schritt ist die häufigste Ursache für NullPointerException für Anfänger Java Code.

Schritt 1) Öffne deine Code-Editor und kopieren Sie den folgenden Code:

class ObjectArray {
    public static void main(String args[]) {
        Account obj[] = new Account[2];
        // obj[0] = new Account();
        // obj[1] = new Account();
        obj[0].setData(1, 2);
        obj[1].setData(3, 4);
        System.out.println("For Array Element 0");
        obj[0].showData();
        System.out.println("For Array Element 1");
        obj[1].showData();
    }
}

class Account {
    int a;
    int b;

    public void setData(int c, int d) {
        a = c;
        b = d;
    }

    public void showData() {
        System.out.println("Value of a = " + a);
        System.out.println("Value of b = " + b);
    }
}

Schritt 2) Speichern Sie die Datei ObjectArray.javaAnschließend kompilieren und ausführen.

Schritt 3) Beachten Sie den Fehler. Versuchen Sie, ihn zu beheben, bevor Sie mit Schritt 4 fortfahren.

Schritt 4) Überprüfen Sie die Leitung Account obj[] = new Account[2];Es allokiert ein Array mit zwei Referenzvariablen vom Typ AccountEs weist jedoch keine Ressourcen zu. Account Objekte. Beide Slots fassen Objekte. nullund Anrufe obj[0].setData(...) auf einem null Referenz wirft einen Fehler NullPointerException zur Laufzeit.

Java Referenzvariablen eines Arrays von Objekten

Schritt 5) Entfernen Sie die Kommentarzeichen in den Zeilen 4 und 5. Diese beiden Zeilen erzeugen echte Werte. Account Objekte und zuweisen Sie sie obj[0] und obj[1]Das Array enthält nun echte Referenzen, und der Code läuft fehlerfrei.

Java Array von Objekten gefüllt

Ausgang:

For Array Element 0
Value of a = 1
Value of b = 2
For Array Element 1
Value of a = 3
Value of b = 4

Wie initialisiert man ein Array von Objekten in Java

Neben der oben gezeigten Initialisierung mittels Setter gibt es drei elegantere Möglichkeiten, ein Array von Objekten zu initialisieren. Jede dieser Methoden ist zwar etwas ausführlicher, dafür aber übersichtlicher. Wählen Sie daher diejenige, die am besten zu Ihrer Situation passt.

  1. Schleifeninitialisierung — Zuerst wird das Array allokiert, dann werden alle Indizes durchlaufen und jeweils ein neues Objekt zugewiesen. Dies ist das Standardverfahren für große Arrays oder wenn die Anzahl der Objekte dynamisch ist.
  2. Konstruktorinitialisierung — Werte werden direkt beim Erstellen des Konstruktors übergeben, sodass kein separater Setter-Aufruf erforderlich ist.
  3. Initialisierung von Array-Literalen — Deklarieren und Befüllen in einer einzigen Anweisung mit einem Inline-Ausdruck { ... } Initialisierer, ideal für kleine, feste Mengen.
class Account {
    int a, b;

    public Account(int a, int b) {   // constructor
        this.a = a;
        this.b = b;
    }
}

public class InitDemo {
    public static void main(String[] args) {

        // 1) Loop initialisation
        Account[] loopArr = new Account[3];
        for (int i = 0; i < loopArr.length; i++) {
            loopArr[i] = new Account(i, i * 10);
        }

        // 2) Constructor initialisation, one slot at a time
        Account[] ctorArr = new Account[2];
        ctorArr[0] = new Account(1, 2);
        ctorArr[1] = new Account(3, 4);

        // 3) Array literal initialisation
        Account[] litArr = {
            new Account(5, 6),
            new Account(7, 8),
            new Account(9, 10)
        };

        System.out.println("loop size   = " + loopArr.length);
        System.out.println("ctor size   = " + ctorArr.length);
        System.out.println("literal size= " + litArr.length);
    }
}

Die Initialisierung mit einer Schleife ist die sicherste Standardmethode, da sie garantiert, dass kein Slot übrig bleibt. nullDie Initialisierung im Konstruktor macht deutlich, wenn jedes Objekt unterschiedliche Argumente benötigt, und Array-Literale halten kleinen Beispielcode kompakt. Vermeiden Sie es, innerhalb desselben Arrays verschiedene Stile zu mischen, es sei denn, es gibt einen triftigen Grund: Konsistenz erleichtert das Auffinden von Fehlern.

Iterieren und Zugriff auf Elemente in einem Java Array von Objekten

Sobald ein Array von Objekten gefüllt ist, decken drei Muster nahezu alle Zugriffsanforderungen ab. Wählen Sie den Schleifenstil, der dem benötigten Kontrollbedarf des Codes über den Index entspricht.

Classic for Schleife ermöglicht den Zugriff auf den Index, was nützlich ist, um Elemente zu ersetzen, Nachbarn zu vergleichen oder einen Teilbereich zu durchlaufen.

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

Verbesserte for Schleife (Die „for-each“-Schleife) verbirgt den Index und ist natürlicher lesbar, wenn der Index nicht benötigt wird:

for (Account acc : obj) {
    acc.showData();
}

Streams (Java 8 und höher) Das Array wird in eine Pipeline umgewandelt, was zum Filtern und Zuordnen praktisch ist.pingoder Aggregation ohne Schleife:

import java.util.Arrays;

Arrays.stream(obj)
      .filter(acc -> acc.a > 0)
      .forEach(Account::showData);

Um ein einzelnes Element zu lesen oder zu aktualisieren, verwenden Sie den direkten Indexzugriff, zum Beispiel obj[1].setData(10, 20)Überprüfen Sie immer zuerst die Länge mit obj.length um zu vermeiden, ArrayIndexOutOfBoundsExceptionWenn jeder Slot belegt werden könnte nullSchützen Sie den Zugriff mit einer Nullprüfung oder einem Optional damit das Programm weiterläuft und nicht abstürzt.

Array von Objekten vs. ArrayList von Objekten in Java

Ein einfaches Array von Objekten ist schnell und vorhersehbar, aber seine feste Größe wird zur Einschränkung, sobald sich die Anzahl der Objekte zur Laufzeit ändert. JavaDas Collections-Framework von bietet ArrayList als dynamische Alternative. Die folgende Tabelle zeigt, wann welche Option jeweils angebracht ist.

FunktionArray von ObjektenArrayList von Objekten
GrößeBei der Erstellung behobenWächst und schrumpft automatisch
ErklärungAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Zugriffselementa[i]list.get(i)
Element hinzufügenWird nach der Erstellung nicht mehr unterstützt.list.add(obj)
TypensicherheitKompilierzeittypisierung durch DeklarationGenerics werden zur Kompilierzeit erzwungen
LeistungGeringfügig schnellere indizierte LesevorgängeAmortisierter O(1)-Auftrag, etwas Overhead pro Element
Bevorzugt, wennDie Größe ist bekannt und festgelegt.Die Größe ist unbekannt oder ändert sich zur Laufzeit.

Verwenden Sie ein Array, wenn ein geringer Speicherbedarf und vorhersehbare Indizierung wichtig sind, beispielsweise bei Matrix-Layouts oder leistungskritischen Hot Paths. Greifen Sie zu ArrayList in den meisten alltäglichen Anwendungscodes, weil die Möglichkeit, ohne Neuzuweisung hinzuzufügen und zu entfernen, den geringen Mehraufwand pro Element überwiegt.

Häufig gestellte Fragen

Ein Array von Objekten in Java ist ein Container fester Größe, der Referenzen auf Instanzen derselben Klasse speichert. Jeder Slot verweist auf ein Objekt im Heap, und auf Elemente wird über einen nullbasierten Index mithilfe eckiger Klammern zugegriffen.

Deklarieren Sie das Array mit `ClassName[] arr = new ClassName[size]` und erstellen Sie anschließend jedes Objekt mit `new ClassName()` in einer Schleife oder mithilfe eines Inline-Array-Literals. Beide Schritte sind erforderlich; der erste reserviert lediglich Referenzspeicherplätze.

Da `new ClassName[size]` nur das Array selbst allokiert, beginnt jeder Eintrag mit `null`. Daher löst der Aufruf einer Methode auf diesem Eintrag eine `NullPointerException` aus. Beheben Sie das Problem, indem Sie jedem Index vor der Verwendung ein neues `ClassName()` zuweisen.

Ein Array hat eine bei der Erstellung festgelegte, feste Größe, während eine ArrayList automatisch wächst und schrumpft. Arrays ermöglichen etwas schnellere indizierte Lesezugriffe; ArrayLists bieten praktische Methoden zum Hinzufügen, Entfernen und Streamen für den alltäglichen Anwendungsbetrieb.

Verwenden Sie eine klassische for-Schleife mit `arr.length`, wenn Sie den Index benötigen, oder eine erweiterte for-each-Schleife für einfache Iterationen. Zum Filtern oder Transformieren umschließen Sie das Array mit `Arrays.stream(arr)` und verketten Sie die benötigte Pipeline.

Deklarieren Sie den Parameter als ClassName[] name und rufen Sie anschließend die Methode mit der Array-Variablen auf. Java Die Array-Referenz wird per Wert übergeben, sodass Änderungen an den Elementfeldern innerhalb der Methode für den Aufrufer sichtbar sind.

Codegeneratoren für maschinelles Lernen erkennen das zweistufige Allokationsmuster und ergänzen die fehlenden `new ClassName()`-Zeilen, die Anfänger oft vergessen. Sie schlagen außerdem `ArrayList` vor, wenn die Größe der Zielsammlung unbekannt ist, wodurch NullPointerException-Fehler reduziert werden.

Ja. GitHub Copilot generiert Array-Deklarationen, Konstruktorschleifen, Iterationsblöcke und ArrayList-Konvertierungen aus einem Kommentar, der das Domänenmodell beschreibt. RevÜberprüfen Sie den generierten Code vor der Verwendung auf korrekte Konstruktorargumente und sichere Nullwertbehandlung.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: