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



