Niz objekata u Java
⚡ Pametni sažetak
Niz objekata u Java pohranjuje reference objekata u susjedni utor fiksne veličine, omogućujući jednoj varijabli da sadrži više instanci klase i pristupa svakoj od njih putem indeksa za iteraciju, mutaciju i prosljeđivanje metodama.
Što je niz objekata u Java?
A Java niz objekata pohranjuje više instanci objekata iste klase u jednom spremniku fiksne veličine. Za razliku od primitivnog niza koji pohranjuje vrijednosti kao što su int, double, ili boolean izravno u svakom utoru pohranjuje se niz objekata referenceSvaki slot pokazuje na memorijsku lokaciju objekta, a sam objekt se nalazi na Java hrpa.
Ovaj raspored odgovara načinu na koji bilo koji objekt varijabla in Java radi. Niz jednostavno grupira nekoliko referenci objekata zajedno tako da im možete pristupiti putem indeksa. To je prirodan izbor kada je broj objekata unaprijed poznat i ne mijenja se tijekom životnog vijeka programa.
Sintaksa
ClassName[] obj = new ClassName[array_length];
Desna strana dodjeljuje prostor za array_length reference, sve inicijalizirane na nullNema predmeta ClassName još postoji, samo kontejner koji može sadržavati reference na takve objekte.
Kako stvoriti niz objekata u Java
Stvaranje radnog niza objekata uvijek traje dva koraka alokacije. Prvi alocira referentni kontejner, a drugi alocira svaki objekt na koji će kontejner pokazivati. Preskočiping Drugi korak je najčešći izvor NullPointerException kod početnika Java kodirati.
Korak 1) Otvorite svoj uređivač koda i kopirajte sljedeći kod:
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); } }
Korak 2) Spremite datoteku kao ObjectArray.java, a zatim ga kompajlirajte i pokrenite.
Korak 3) Zabilježite grešku. Pokušajte je otkloniti prije nego što nastavite na korak 4.
Korak 4) Pregledajte liniju Account obj[] = new Account[2];Dodjeljuje niz od dvije referentne varijable tipa Account, ali ne dodjeljuje nijedan Account predmete. Oba utora drže nulli pozivanje obj[0].setData(...) na null referenca baca NullPointerException za vrijeme izvođenja.
Korak 5) Odkomentirajte retke 4 i 5. Ova dva retka stvaraju stvarne Account objekte i dodijeliti im obj[0] i obj[1]Niz sada sadrži stvarne reference i kod se izvodi čisto.
Izlaz:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Kako inicijalizirati niz objekata u Java
Osim inicijalizacije temeljene na postavljačima prikazane gore, niz objekata može se inicijalizirati na tri čišća načina. Svaki stil žrtvuje opširnost za jasnoću, stoga odaberite onaj koji najbolje odgovara situaciji.
- Inicijalizacija petlje — dodijeliti niz, zatim proći kroz svaki indeks i dodijeliti novi objekt. Ovo je standardni obrazac za velike nizove ili kada je broj objekata dinamičan.
- Inicijalizacija konstruktora — proslijedite vrijednosti izravno konstruktoru u trenutku kreiranja tako da nije potreban zaseban poziv settera.
- Inicijalizacija literala polja — deklarirati i popuniti u jednoj naredbi s inline
{ ... }inicijalizator, idealan za male fiksne skupove.
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); } }
Inicijalizacija petlje je najsigurnija zadana postavka jer jamči da nema preostalog utora. nullInicijalizacija konstruktora čini namjeru eksplicitnom kada svaki objekt treba različite argumente, a literali polja održavaju mali demo kod kompaktnim. Nemojte miješati stilove unutar istog polja osim ako nemate razlog: dosljednost olakšava uočavanje grešaka.
Iteriranje i pristup elementima u Java Niz objekata
Nakon što se niz objekata popuni, tri obrasca pokrivaju gotovo svaku potrebu pristupa. Odaberite stil petlje koji odgovara količini kontrole koju kod treba nad indeksom.
klasik for petlja daje pristup indeksu, što je korisno za zamjenu elemenata, usporedbu susjednih elemenata ili iteraciju podraspona.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Poboljšana for petlja (petlja „for-each“) skriva indeks i čita se prirodnije kada indeks nije potreban:
for (Account acc : obj) {
acc.showData();
}
Streamovi (Java 8 i kasnije) pretvoriti niz u cjevovod, što je praktično za filtriranje, mapiranjeping, ili agregiranje bez pisanja petlje:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
Za čitanje ili ažuriranje jednog elementa koristite izravni pristup indeksu, na primjer obj[1].setData(10, 20)Uvijek prvo provjerite duljinu s obj.length Izbjeći ArrayIndexOutOfBoundsExceptionKada bilo koji utor može biti null, zaštitite pristup provjerom null vrijednosti ili Optional kako bi program nastavio raditi umjesto da se sruši.
Niz objekata u odnosu na ArrayList objekata u Java
Običan niz objekata je brz i predvidljiv, ali njegova fiksna veličina postaje ograničenje čim se broj objekata promijeni tijekom izvođenja. JavaOkvir za kolekcije pruža ArrayList kao dinamička alternativa. Tablica u nastavku ističe kada je svaki izbor prikladan.
| svojstvo | Niz objekata | NizPopisObjekata |
|---|---|---|
| Veličina | Fiksirano prilikom kreiranja | Automatski raste i smanjuje se |
| izjava | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Element pristupa | a[i] | list.get(i) |
| Dodaj element | Nije podržano nakon kreiranja | list.add(obj) |
| Vrsta sigurnosti | Tipizirano deklaracijom za vrijeme kompajliranja | Generički tipovi se primjenjuju tijekom kompajliranja |
| Izvođenje | Marginalno brže indeksirano čitanje | Amortizirani O(1) dodatak, neki režijski troškovi po elementu |
| Poželjno kada | Veličina je poznata i fiksna | Veličina je nepoznata ili se mijenja tijekom izvođenja |
Koristite niz kada je ograničen memorijski otisak i predvidljivo indeksiranje važni, na primjer u matričnim rasporedima ili vrućim putovima kritičnim za performanse. Posegnite za ArrayList u većini svakodnevnog aplikacijskog koda, jer mogućnost dodavanja i uklanjanja bez realokacije nadmašuje mali opterećenje po elementu.



