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. Java Sammlungsrahmen unterstรผtzt 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: