En rekke objekter i Java
โก Smart oppsummering
En rekke objekter i Java lagrer objektreferanser i et sammenhengende spor med fast stรธrrelse, slik at en enkelt variabel kan inneholde mange forekomster av en klasse og fรฅ tilgang til hver enkelt gjennom en indeks for iterasjon, mutasjon og overfรธring til metoder.
Hva er en matrise av objekter i Java?
A Java rekke objekter lagrer flere objektforekomster av samme klasse i en enkelt container med fast stรธrrelse. I motsetning til en primitiv array som lagrer verdier som int, doubleeller boolean direkte i hvert spor lagres en rekke objekter referanserHvert spor peker til minneplasseringen til et objekt, og selve objektet befinner seg pรฅ Java haug.
Dette oppsettet samsvarer med hvordan ethvert objekt variabel in Java fungerer. Arrayet grupperer ganske enkelt flere objektreferanser sammen slik at du kan fรฅ tilgang til dem via indeks. Det er det naturlige valget nรฅr antallet objekter er kjent pรฅ forhรฅnd og ikke endres i lรธpet av programmets levetid.
syntax
ClassName[] obj = new ClassName[array_length];
Hรธyresiden gir plass til array_length referanser, alle initialisert til nullIngen gjenstand for ClassName finnes ennรฅ, bare beholderen som kan inneholde referanser til slike objekter.
Slik lager du en matrise med objekter i Java
ร
opprette en fungerende array av objekter tar alltid to allokeringstrinn. Det fรธrste allokerer referansecontaineren, og det andre allokerer hvert objekt som containeren skal peke til.ping Det andre trinnet er den vanligste kilden til NullPointerException i nybegynner Java kode.
Trinn 1) ร pne din kode redaktรธr 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); } }
Trinn 2) Lagre filen som ObjectArray.java, og deretter kompilere og kjรธre den.
Trinn 3) Merk deg feilen. Prรธv รฅ feilsรธke den fรธr du fortsetter til trinn 4.
Trinn 4) Inspiser linjen Account obj[] = new Account[2];Den tildeler en matrise med to referansevariabler av typen Account, men den tildeler ingen Account gjenstander. Begge sporene holder null, og ringer obj[0].setData(...) pรฅ en null referanse kaster en NullPointerException under kjรธring.
Trinn 5) Fjern kommenteringen av linje 4 og 5. Disse to linjene skaper ekte Account objekter og tilordne dem til obj[0] og obj[1]Arrayet inneholder nรฅ ekte referanser, og koden kjรธrer uten problemer.
Utgang:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Slik initialiserer du en matrise med objekter i Java
Utover den setterbaserte initialiseringen vist ovenfor, kan en rekke objekter initialiseres pรฅ tre renere mรฅter. Hver stil bytter ut ordrikhet for klarhet, sรฅ velg den som passer best til situasjonen.
- Loopinitialisering โ alloker arrayet, gรฅ deretter gjennom hver indeks og tilordne et nytt objekt. Dette er standardmรธnsteret for store arrayer eller nรฅr objektantallet er dynamisk.
- Konstruktรธrinitialisering โ send verdier direkte til konstruktรธren ved opprettelse, slik at det ikke er behov for et separat setter-kall.
- Array-litteral initialisering โ deklarere og fylle ut i en enkelt setning med en innebygd
{ ... }initialisering, ideell for smรฅ faste sett.
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 standarden fordi den garanterer at det ikke er noen spor igjen nullKonstruktรธrinitialisering gjรธr intensjonen eksplisitt nรฅr hvert objekt trenger forskjellige argumenter, og array-literaler holder liten demokode kompakt. Ikke bland stiler i samme array med mindre du har en grunn: konsistens gjรธr det lettere รฅ oppdage feil.
Iterering og tilgang til elementer i en Java En rekke objekter
Nรฅr en rekke med objekter er fylt ut, dekker tre mรธnstre nesten alle tilgangsbehov. Velg lรธkkestilen som samsvarer med hvor mye kontroll koden trenger over indeksen.
Classic for slรธyfe gir tilgang til indeksen, som er nyttig for รฅ erstatte elementer, sammenligne naboer eller iterere et delomrรฅde.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Forbedret for slรธyfe (ยซfor-eachยป-lรธkken) skjuler indeksen og leser mer naturlig nรฅr indeksen ikke er nรธdvendig:
for (Account acc : obj) {
acc.showData();
}
Strรธmmer (Java 8 og senere) konvertere arrayet til en pipeline, noe som er nyttig for filtrering, kartleggingping, eller aggregering uten รฅ skrive en lรธkke:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
For รฅ lese eller oppdatere et enkelt element, bruk for eksempel direkte indekstilgang obj[1].setData(10, 20)Sjekk alltid lengden fรธrst med obj.length รฅ unngรฅ ArrayIndexOutOfBoundsExceptionNรฅr et hvilket som helst spor kan vรฆre null, beskytt tilgangen med en nullkontroll eller en Optional for รฅ holde programmet i gang i stedet for รฅ krasje.
Matrise av objekter vs. Matriseliste av objekter i Java
En enkel matrise av objekter er rask og forutsigbar, men den faste stรธrrelsen blir en begrensning sรฅ snart objektantallet endres under kjรธretid. Java'S Innsamlingsramme gir ArrayList som det dynamiske alternativet. Tabellen nedenfor viser nรฅr hvert valg er passende.
| Trekk | En rekke objekter | ArrayListe over objekter |
|---|---|---|
| Stรธrrelse | Fikset ved opprettelse | Vokser og krymper automatisk |
| Erklรฆring | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Tilgangselement | a[i] | list.get(i) |
| Legg til element | Stรธttes ikke etter opprettelse | list.add(obj) |
| Type sikkerhet | Kompileringstidstypet av deklarasjon | Generiske elementer hรฅndheves ved kompileringstid |
| Ytelse | Marginalt raskere indekserte lesninger | Amortisert O(1) tillegg, noe overhead per element |
| Foretrukket nรฅr | Stรธrrelsen er kjent og fast | Stรธrrelsen er ukjent eller endres under kjรธring |
Bruk en array nรฅr et begrenset minneavtrykk og forutsigbar indeksering er viktig, for eksempel i matriseoppsett eller ytelseskritiske hot paths. Streik etter ArrayList i det meste av hverdagslig applikasjonskode, fordi muligheten til รฅ legge til og fjerne uten omallokering oppveier den lille overheaden per element.



