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.
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.
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.
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.
- 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.
- Konstruktorinitialisierung — Werte werden direkt beim Erstellen des Konstruktors übergeben, sodass kein separater Setter-Aufruf erforderlich ist.
- 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.
| Funktion | Array von Objekten | ArrayList von Objekten |
|---|---|---|
| Größe | Bei der Erstellung behoben | Wächst und schrumpft automatisch |
| Erklärung | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Zugriffselement | a[i] | list.get(i) |
| Element hinzufügen | Wird nach der Erstellung nicht mehr unterstützt. | list.add(obj) |
| Typensicherheit | Kompilierzeittypisierung durch Deklaration | Generics werden zur Kompilierzeit erzwungen |
| Leistung | Geringfügig schnellere indizierte Lesevorgänge | Amortisierter O(1)-Auftrag, etwas Overhead pro Element |
| Bevorzugt, wenn | Die 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.



