Matrice de obiecte în Java
⚡ Rezumat inteligent
Matrice de obiecte în Java stochează referințele la obiecte într-un slot contiguu de dimensiune fixă, permițând unei singure variabile să conțină mai multe instanțe ale unei clase și să le acceseze pe fiecare printr-un index pentru iterație, mutație și transmitere către metode.
Ce este o matrice de obiecte în Java?
A Java matrice de obiecte stochează mai multe instanțe de obiecte din aceeași clasă într-un singur container cu dimensiune fixă. Spre deosebire de o matrice primitivă care stochează valori precum int, double, boolean direct în fiecare slot, o matrice de obiecte stochează referințeFiecare slot indică locația de memorie a unui obiect, iar obiectul în sine se află pe Java morman.
Această dispunere se potrivește cu modul în care orice obiect variabil in Java funcționează. Tabloul grupează pur și simplu mai multe referințe la obiecte, astfel încât să le puteți accesa prin index. Este alegerea naturală atunci când numărul de obiecte este cunoscut dinainte și nu se modifică pe parcursul existenței programului.
Sintaxă
ClassName[] obj = new ClassName[array_length];
Partea dreaptă alocă spațiu pentru array_length referințe, toate inițializate la nullNiciun obiect de ClassName există încă, doar containerul care poate conține referințe la astfel de obiecte.
Cum se creează o matrice de obiecte în Java
Crearea unei matrice funcționale de obiecte necesită întotdeauna doi pași de alocare. Primul alocă containerul de referință, iar al doilea alocă fiecare obiect la care va indica containerul. Sari pesteping al doilea pas este cea mai comună sursă de NullPointerException la începători Java cod.
Pas 1) Deschide-ul editor de coduri și copiați următorul cod:
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); } }
Pas 2) Salvați fișierul ca ObjectArray.java, apoi compilează-l și rulează-l.
Pas 3) Rețineți eroarea. Încercați să o depanați înainte de a continua la Pasul 4.
Pas 4) Inspectați linia Account obj[] = new Account[2];Alocă o matrice de două variabile de referință de tip Account, dar nu alocă niciun Account obiecte. Ambele sloturi țin nullși apelând obj[0].setData(...) pe o null referința aruncă o NullPointerException în timpul rulării.
Pas 5) Eliminați comentariile de la liniile 4 și 5. Aceste două linii creează Account obiecte și le atribuiți obj[0] și obj[1]Matricea conține acum referințe reale, iar codul rulează corect.
ieșire:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Cum se inițializează o matrice de obiecte în Java
Dincolo de inițializarea bazată pe setter, prezentată mai sus, o serie de obiecte poate fi inițializată în trei moduri mai clare. Fiecare stil schimbă verbositatea în favoarea clarității, așa că alegeți-l pe cel care se potrivește cel mai bine situației.
- Inițializarea buclei — alocă matricea, apoi parcurge fiecare index și atribuie un obiect nou. Acesta este modelul standard pentru matricele mari sau când numărul de obiecte este dinamic.
- Inițializarea constructorului — transmit valorile direct constructorului în momentul creării, astfel încât să nu fie nevoie de un apel separat pentru setter.
- Inițializarea literală a matricei — declară și populează într-o singură instrucțiune cu un inline
{ ... }inițializator, ideal pentru seturi fixe mici.
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); } }
Inițializarea buclei este cea mai sigură implicită, deoarece garantează că nu este lăsat niciun slot. nullInițializarea constructorului explică intenția atunci când fiecare obiect are nevoie de argumente diferite, iar literalii din matrice mențin codul demonstrativ mic compact. Nu amestecați stiluri în interiorul aceleiași matrice decât dacă aveți un motiv: consecvența face erorile mai ușor de detectat.
Iterarea și accesarea elementelor într-un Java Matrice de obiecte
Odată ce o matrice de obiecte este populată, trei modele acoperă aproape fiecare nevoie de acces. Alegeți stilul de buclă care corespunde cu cât control are nevoie codul asupra indexului.
Clasic for buclă oferă acces la index, care este util pentru înlocuirea elementelor, compararea vecinilor sau iterarea unui subinterval.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
pachet plus for buclă (bucla „for-each”) ascunde indexul și se citește mai natural atunci când indexul nu este necesar:
for (Account acc : obj) {
acc.showData();
}
Fluxuri (Java 8 și versiunile ulterioare) convertește matricea într-o conductă, ceea ce este util pentru filtrare, mapareping, sau agregarea fără a scrie o buclă:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Pentru a citi sau actualiza un singur element, utilizați accesul direct la index, de exemplu obj[1].setData(10, 20)Verificați întotdeauna lungimea mai întâi cu obj.length a evita ArrayIndexOutOfBoundsExceptionCând orice slot putea fi null, protejează accesul cu o verificare nulă sau cu un Optional pentru a menține programul în funcțiune în loc să se blocheze.
Matrice de obiecte vs. MatriceList de obiecte în Java
O matrice simplă de obiecte este rapidă și previzibilă, dar dimensiunea sa fixă devine o limitare imediat ce numărul de obiecte se modifică în timpul execuției. Java'S Cadrul colecțiilor furnizează ArrayList ca alternativă dinamică. Tabelul de mai jos evidențiază când este potrivită fiecare opțiune.
| Caracteristică | Matrice de obiecte | ArrayList de obiecte |
|---|---|---|
| Mărimea | Fixat la creare | Crește și se micșorează automat |
| Declarație | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Element de acces | a[i] | list.get(i) |
| Adăugați element | Nu este acceptat după creare | list.add(obj) |
| Tip siguranță | Compilare tipizată prin declarație | Genericele aplicate la momentul compilării |
| Performanţă | Citiri indexate puțin mai rapide | Adăugați O(1) amortizat, unele cheltuieli generale per element |
| Preferat când | Mărimea este cunoscută și fixă | Dimensiunea este necunoscută sau se modifică în timpul execuției |
Folosește o matrice atunci când o amprentă de memorie redusă și o indexare previzibilă sunt importante, de exemplu în structuri matriciale sau căi de acces critice pentru performanță. Apelează la ArrayList în majoritatea codului de aplicații de zi cu zi, deoarece capacitatea de a adăuga și elimina fără realocare depășește costul mic per element.



