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.

  • ???? Referentna pohrana: Svaki utor u Java Niz objekata sadrži referencu na objekt, a ne sam objekt, slično bilo kojoj varijabli objekta u Java.
  • 🧱 Izrada u dva koraka: Dodijelite niz s novim ClassName[size], zatim svakom objektu dodijelite novi ClassName() prije pozivanja metoda na njemu.
  • ⚠️ NullPointerException: Svaki slot započinje kao null. Pozivanje metode na neinicijaliziranom slotu izbacuje NullPointerException tijekom izvođenja.
  • 🔁 Iteracija: Koristite for petlju s duljinom polja ili poboljšanu for petlju za prolazak kroz svaki objekt u polju.
  • 📏 Fiksna veličina: Niz se ne može povećavati nakon alokacije. Koristite ArrayList kada se broj objekata promijeni tijekom izvođenja.
  • 🏗️ Inicijalizacija konstruktora: Konstruktori koji se prosljeđuju inline tijekom kreiranja daju kraće i sigurnije postavljanje od post-hoc poziva settera.
  • 🚚 Parametar metode: Predavanjem niza metodi prenosi se referenca, tako da su promjene unutar metode vidljive pozivatelju.

Niz objekata u Java

Š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.

Java Niz objekata referencira varijable

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.

Java Niz objekata popunjen

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.

  1. 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.
  2. Inicijalizacija konstruktora — proslijedite vrijednosti izravno konstruktoru u trenutku kreiranja tako da nije potreban zaseban poziv settera.
  3. 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.

svojstvoNiz objekataNizPopisObjekata
VeličinaFiksirano prilikom kreiranjaAutomatski raste i smanjuje se
izjavaAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Element pristupaa[i]list.get(i)
Dodaj elementNije podržano nakon kreiranjalist.add(obj)
Vrsta sigurnostiTipizirano deklaracijom za vrijeme kompajliranjaGenerički tipovi se primjenjuju tijekom kompajliranja
IzvođenjeMarginalno brže indeksirano čitanjeAmortizirani O(1) dodatak, neki režijski troškovi po elementu
Poželjno kadaVeličina je poznata i fiksnaVelič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.

Pitanja i odgovori

Niz objekata u Java je kontejner fiksne veličine koji pohranjuje reference na instance iste klase. Svaki slot pokazuje na objekt na hrpi, a elementima se pristupa pomoću indeksa koji se temelji na nuli pomoću uglatih zagrada.

Deklarirajte niz s ClassName[] arr = new ClassName[size], a zatim stvorite svaki objekt s new ClassName() u petlji ili s inline nizom literala. Oba koraka su obavezna; prvi dodjeljuje samo referentne slotove.

Jer new ClassName[size] samo alocira sam niz. Svaki slot počinje kao null, pa pozivanje bilo koje metode na tom slotu baca NullPointerException. Ispravite to dodjeljivanjem novog ClassName() svakom indeksu prije upotrebe.

Niz ima fiksnu veličinu odabranu prilikom stvaranja, dok ArrayList automatski raste i smanjuje. Nizovi omogućuju nešto brže indeksirano čitanje; ArrayList dodaje praktične metode dodavanja, uklanjanja i strujanja za svakodnevni kod aplikacije.

Koristite klasičnu for petlju s arr.length kada vam je potreban indeks ili poboljšanu for-each petlju za jednostavnu iteraciju. Za filtriranje ili transformaciju, omotajte niz s Arrays.stream(arr) i ulančajte potreban cjevovod.

Deklarišajte parametar kao ClassName[] ime, a zatim pozovite metodu s varijablom niza. Java prosljeđuje referencu polja po vrijednosti, tako da su mutacije polja elemenata unutar metode vidljive pozivatelju.

Generatori koda za strojno učenje prepoznaju dvostepeni obrazac alokacije i dopunjuju nedostajuće nove retke ClassName() koje početnici zaboravljaju. Također predlažu ArrayList kada je veličina ciljne kolekcije nepoznata, smanjujući greške NullPointerException.

Da. GitHub Copilot generira deklaracije nizova, petlje konstruktora, blokove iteracija i ArrayList konverzije iz komentara koji opisuje model domene. RevPrije upotrebe pogledajte generirani kod za ispravne argumente konstruktora i sigurno rukovanje null vrijednostima.

Sažmite ovu objavu uz: