Array af objekter i Java
⚡ Smart opsummering
Array af objekter i Java lagrer objektreferencer i et sammenhængende slot med fast størrelse, hvilket lader en enkelt variabel indeholde mange instanser af en klasse og tilgå hver enkelt via et indeks til iteration, mutation og videregivelse til metoder.
Hvad er et array af objekter i Java?
A Java række af objekter lagrer flere objektinstanser af samme klasse i en enkelt container med fast størrelse. I modsætning til et primitivt array, der lagrer værdier som f.eks. int, double eller boolean direkte i hvert slot lagres en række objekter referencerHvert slot peger på et objekts hukommelsesplacering, og selve objektet findes på Java bunke.
Dette layout matcher, hvordan ethvert objekt variabel in Java fungerer. Arrayet grupperer simpelthen flere objektreferencer sammen, så du kan tilgå dem via indeks. Det er det naturlige valg, når antallet af objekter er kendt på forhånd og ikke ændrer sig i løbet af programmets levetid.
Syntaks
ClassName[] obj = new ClassName[array_length];
Højre side giver plads til array_length referencer, alle initialiseret til nullIntet objekt af ClassName findes endnu, kun den container, der kan indeholde referencer til sådanne objekter.
Sådan opretter du et array af objekter i Java
Oprettelse af et fungerende array af objekter tager altid to allokeringstrin. Det første allokerer referencecontaineren, og det andet allokerer hvert objekt, som containeren skal pege på. Spring overping Det andet trin er den mest almindelige kilde til NullPointerException hos begyndere Java kode.
Trin 1) Åbn din kode editor og kopier følgende kode:
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); } }
Trin 2) Gem filen som ObjectArray.java, og kompiler og kør det derefter.
Trin 3) Bemærk fejlen. Prøv at foretage en fejlfinding, før du fortsætter til trin 4.
Trin 4) Inspicer linjen Account obj[] = new Account[2];Den allokerer et array af to referencevariabler af typen Account, men den tildeler ikke nogen Account genstande. Begge åbninger holder null, og ringer obj[0].setData(...) på en null reference kaster en NullPointerException ved kørsel.
Trin 5) Fjern kommentar fra linje 4 og 5. Disse to linjer skaber reelle Account objekter og tildel dem til obj[0] og obj[1]Arrayet indeholder nu reelle referencer, og koden kører uden problemer.
Output:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Sådan initialiserer du et array af objekter i Java
Ud over den setter-baserede initialisering vist ovenfor, kan en række objekter initialiseres på tre mere overskuelige måder. Hver stil bytter ordgængelighed ud med klarhed, så vælg den, der bedst passer til situationen.
- Loopinitialisering — alloker arrayet, gennemgå derefter hvert indeks og tildel et nyt objekt. Dette er standardmønsteret for store arrays eller når objektantallet er dynamisk.
- Konstruktørinitialisering — send værdier direkte til konstruktøren på oprettelsestidspunktet, så der ikke er behov for et separat setter-kald.
- Array literal initialisering — deklarere og udfylde i en enkelt sætning med en inline
{ ... }initialisering, ideel til små faste sæt.
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); } }
Loopinitialisering er den sikreste standard, fordi den garanterer, at der ikke er nogen plads tilbage nullKonstruktørinitialisering gør intentionen eksplicit, når hvert objekt kræver forskellige argumenter, og array-literaler holder lille demokode kompakt. Bland ikke stilarter inden for det samme array, medmindre du har en grund: konsistens gør det lettere at få øje på fejl.
Iterering og adgang til elementer i en Java Array af objekter
Når et array af objekter er udfyldt, dækker tre mønstre næsten ethvert adgangsbehov. Vælg den løkkestil, der matcher, hvor meget kontrol koden har brug for over indekset.
klassisk for loop giver adgang til indekset, hvilket er nyttigt til at erstatte elementer, sammenligne naboer eller iterere et underområde.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Udvidet for loop ("for-each"-løkken) skjuler indekset og læser mere naturligt, når indekset ikke er nødvendigt:
for (Account acc : obj) {
acc.showData();
}
Strømme (Java 8 og senere) konverter arrayet til en pipeline, hvilket er praktisk til filtrering, kortlægningping, eller aggregering uden at skrive en løkke:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
For at læse eller opdatere et enkelt element skal du bruge direkte indeksadgang, for eksempel obj[1].setData(10, 20)Kontroller altid længden først med obj.length at undgå ArrayIndexOutOfBoundsExceptionNår en hvilken som helst plads kunne være null, beskyt adgangen med en null-kontrol eller en Optional for at holde programmet kørende i stedet for at det går ned.
Array af objekter vs. ArrayListe af objekter i Java
Et almindeligt array af objekter er hurtigt og forudsigeligt, men dets faste størrelse bliver en begrænsning, så snart objektantallet ændres under kørsel. Java's Indsamlingsramme giver ArrayList som det dynamiske alternativ. Tabellen nedenfor fremhæver, hvornår hvert valg er passende.
| Feature | Array af objekter | ArrayListe over objekter |
|---|---|---|
| Størrelse | Rettet ved oprettelse | Vokser og krymper automatisk |
| Erklæring | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Adgangselement | a[i] | list.get(i) |
| Tilføj element | Ikke understøttet efter oprettelse | list.add(obj) |
| Type sikkerhed | Kompileringstid indtastet af deklaration | Generiske elementer håndhæves ved kompileringstid |
| Ydeevne | Marginalt hurtigere indekserede læsninger | Amortiseret O(1) tilføjelse, noget overhead pr. element |
| Foretrukket når | Størrelsen er kendt og fastlagt | Størrelsen er ukendt eller ændres under kørsel |
Brug et array, når et begrænset hukommelsesfodaftryk og forudsigelig indeksering er vigtige, for eksempel i matrixlayouts eller ydeevnekritiske hot paths. ArrayList i det meste hverdagsapplikationskode, fordi muligheden for at tilføje og fjerne uden omallokering opvejer den lille overhead pr. element.



