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. Java'S Okvir za zbirke osigurava 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: