Objektide massiiv Java

⚡ Nutikas kokkuvõte

Objektide massiiv Java salvestab objektiviited fikseeritud suurusega külgnevas pesas, võimaldades ühel muutujal hoida klassi paljusid eksemplare ja pääseda igale neist juurde indeksi kaudu iteratsiooni, muteerimise ja meetoditele edastamise jaoks.

  • 📦 Viitesalvestus: Iga pesa a-s Java Objektimassiiv sisaldab viidet objektile, mitte objektile endale, sarnaselt iga objektimuutujaga Java.
  • 🧱 Kaheastmeline loomine: Määra massiivile uus ClassName[size] ja seejärel määra igale objektile uus ClassName() enne meetodite kutsumist.
  • ⚠️ NullPointerException: Iga pesa algab nullväärtusega. Meetodi kutsumine initsialiseerimata pesal tekitab käitusajal NullPointerExceptioni.
  • 🔁 Kordamine: Massiivi iga objekti läbimiseks kasutage massiivi pikkusega for-tsüklit või täiustatud for-tsüklit.
  • 📏 Fikseeritud suurus: Massiiv ei saa pärast eraldamist kasvada. Kasutage ArrayList'i, kui objektide arv käitusajal muutub.
  • 🏗️ Konstruktori init: Loomise ajal reale edastatud konstruktorid pakuvad lühemat ja turvalisemat seadistust kui post-hoc setter-kõned.
  • 🚚 Meetodi parameeter: Massiivi edastamine meetodile edastab viite, seega on meetodi sees tehtud muudatused helistajale nähtavad.

Objektide massiiv Java

Mis on objektide massiiv Java?

A Java objektide hulk salvestab sama klassi mitu objekti eksemplari ühte kindla suurusega konteinerisse. Erinevalt primitiivsest massiivist, mis salvestab selliseid väärtusi nagu int, doublevõi boolean otse igasse pesasse salvestatakse objektide massiiv viitedIga pesa osutab objekti mäluasukohale ja objekt ise asub seal. Java hunnik.

See paigutus sobib iga objektiga muutuja in Java töötab. Massiiv lihtsalt grupeerib mitu objektiviidet kokku, et saaksite neile indeksi järgi ligi pääseda. See on loomulik valik, kui objektide arv on ette teada ja programmi eluea jooksul ei muutu.

Süntaks

ClassName[] obj = new ClassName[array_length];

Parem pool eraldab ruumi array_length viited, kõik initsialiseeritud nullEi ole objekti ClassName on veel olemas, ainult konteiner, mis saab hoida viiteid sellistele objektidele.

Kuidas luua objektide massiivi Java

Töötava objektimassiivi loomine hõlmab alati kahte eraldamisetappi. Esimene eraldab viitekonteineri ja teine ​​eraldab iga objekti, millele konteiner osutab. Jäta vahele.ping teine ​​samm on kõige levinum allikas NullPointerException algajale Java kood.

Step 1) Ava oma koodi redaktor ja kopeeri järgmine kood:

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);
    }
}

Step 2) Salvestage fail nimega ObjectArray.java, seejärel kompileeri ja käivita see.

Step 3) Pane viga tähele. Enne 4. sammu juurde jätkamist proovi see siluda.

Step 4) Kontrollige joont Account obj[] = new Account[2];See eraldab kahest tüüpi viitemuutujast koosneva massiivi Account, aga see ei eralda ühtegi Account objektid. Mõlemad pesad mahutavad nullja helistades obj[0].setData(...) kohta null viide viskab a NullPointerException käitusajal.

Java Objektide viitemuutujate massiiv

Step 5) Kommenteeri read 4 ja 5. Need kaks rida loovad reaalarvud. Account objektid ja määrake need obj[0] ja obj[1]Massiiv sisaldab nüüd reaalseid viiteid ja kood töötab veatult.

Java Objektide massiiv asustatud

Väljund:

For Array Element 0
Value of a = 1
Value of b = 2
For Array Element 1
Value of a = 3
Value of b = 4

Kuidas objektide massiivi initsialiseerida Java

Lisaks ülalpool näidatud setter-põhisele initsialiseerimisele saab objektimassiivi initsialiseerida kolmel puhtamal viisil. Iga stiil vahetab selguse huvides detailsuse üle, seega vali see, mis olukorrale kõige paremini sobib.

  1. Tsükli initsialiseerimine — eraldage massiiv, seejärel läbige iga indeks ja määrake uus objekt. See on standardmuster suurte massiivide või dünaamilise objektide arvu korral.
  2. Konstruktori initsialiseerimine — edastavad väärtused loomise ajal otse konstruktorile, seega pole vaja eraldi setter-kutset.
  3. Massiivi literaali initsialiseerimine — deklareerida ja täita ühes lauses reasisese lisamisega { ... } initsialiseerija, ideaalne väikeste fikseeritud komplektide jaoks.
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);
    }
}

Tsükli initsialiseerimine on kõige turvalisem vaikesäte, kuna see garanteerib, et ühtegi pesa ei jää alles. nullKonstruktori initsialiseerimine muudab kavatsuse selgeks, kui iga objekt vajab erinevaid argumente, ja massiivi literaalid hoiavad väikese demokoodi kompaktsena. Ärge segage stiile samas massiivis, kui teil pole selleks põhjust: järjepidevus muudab vigade märkamise lihtsamaks.

Elementide itereerimine ja neile juurdepääs Java Objektide massiiv

Kui objektide massiiv on täidetud, katavad kolm mustrit peaaegu kõik juurdepääsuvajadused. Valige tsükli stiil, mis vastab koodi vajalikule kontrollile indeksi üle.

klassikaline for silmus annab ligipääsu indeksile, mis on kasulik elementide asendamiseks, naabrite võrdlemiseks või alamvahemiku itereerimiseks.

for (int i = 0; i < obj.length; i++) {
    System.out.println("Element " + i);
    obj[i].showData();
}

Tõhustatud for silmus (tsükkel „for-each“) peidab indeksi ja loeb loomulikumalt, kui indeksit pole vaja:

for (Account acc : obj) {
    acc.showData();
}

Vood (Java 8 ja hilisemad) teisendage massiiv torujuhtmeks, mis on mugav filtreerimiseks, kaardistamisekspingvõi agregeerimine ilma tsüklit kirjutamata:

import java.util.Arrays;

Arrays.stream(obj)
      .filter(acc -> acc.a > 0)
      .forEach(Account::showData);

Näiteks ühe elemendi lugemiseks või värskendamiseks kasutage otsest indeksile juurdepääsu. obj[1].setData(10, 20)Kontrollige alati esmalt pikkust obj.length vältima ArrayIndexOutOfBoundsExceptionKui ükskõik milline pesa võiks olla null, kaitske juurdepääsu nullkontrolli või Optional et programm töötaks, mitte ei krahhiks.

Objektide massiiv vs objektide ArrayList Java

Lihtne objektide massiiv on kiire ja etteaimatav, kuid selle fikseeritud suurus muutub piiranguks niipea, kui objektide arv käitusajal muutub. JavaKogude raamistik pakub ArrayList dünaamilise alternatiivina. Allolev tabel toob esile, millal iga valik on sobiv.

tunnusjoonObjektide massiivObjektide massiiviloend
MõõtFikseeritud loomiselKasvab ja kahaneb automaatselt
deklaratsioonAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Juurdepääsuelementa[i]list.get(i)
Lisa elementPärast loomist ei toetatalist.add(obj)
Tüübi ohutusKompileerimise ajal tüübitud deklaratsiooni järgiKompileerimise ajal jõustatavad geneerilised koodid
jõudlusVeidi kiiremad indekseeritud lugemisedAmortiseeritud O(1) lisakulud, teatud üldkulud elemendi kohta
Eelistatud siis, kuiSuurus on teada ja fikseeritudSuurus on teadmata või muutub käitusajal

Kasutage massiivi, kui väike mälumaht ja prognoositav indekseerimine on olulised, näiteks maatriksipaigutuste või jõudluskriitiliste kiirteede puhul. ArrayList enamikus igapäevases rakenduskoodis, kuna ümberjaotamiseta lisamise ja eemaldamise võimalus kaalub üles väikese elemendi kohta tekkiva üldkulu.

KKK

Objektide massiiv Java on fikseeritud suurusega konteiner, mis salvestab viiteid sama klassi eksemplaridele. Iga pesa osutab heapil olevale objektile ja elementidele pääseb ligi nullpõhise indeksi abil, kasutades nurksulge.

Deklareeri massiiv funktsiooniga ClassName[] arr = new ClassName[size] ja loo seejärel iga objekt funktsiooniga new ClassName() tsüklis või reasisese massiivi literaaliga. Mõlemad sammud on kohustuslikud; esimene eraldab ainult viitepesad.

Kuna uus ClassName[size] eraldab ainult massiivi enda. Iga pesa algab nullväärtusega, siis iga meetodi kutsumine sellel pesal tekitab NullPointerException'i. Paranda see, määrates enne kasutamist igale indeksile uue ClassName().

Massiivi loomisel valitakse fikseeritud suurus, samas kui ArrayList kasvab ja kahaneb automaatselt. Massiivid pakuvad veidi kiiremat indekseeritud lugemist; ArrayList lisab igapäevase rakenduskoodi jaoks mugavad lisamis-, eemaldamis- ja voogedastusmeetodid.

Indeksi vajaduse korral kasuta klassikalist for-tsüklit funktsiooniga arr.length või lihtsa iteratsiooni jaoks täiustatud for-each-tsüklit. Filtreerimiseks või teisendamiseks mässi massiiv funktsiooniga Arrays.stream(arr) ja ahelda vajalik torujuhe.

Deklareeri parameeter ClassName[] nimena ja seejärel kutsu meetod massiivimuutujaga välja. Java edastab massiivi viite väärtuse järgi, seega on meetodi sees olevate elemendiväljade mutatsioonid helistajale nähtavad.

Masinõppe koodigeneraatorid tunnevad ära kaheastmelise eraldamismustri ja täiendavad algajatele ununevaid uusi ClassName() ridu. Samuti pakuvad nad ArrayListi, kui sihtkogu suurus pole teada, vähendades NullPointerExceptioni vigu.

Jah. GitHub Copilot genereerib domeenimudelit kirjeldava kommentaari põhjal massiivideklaratsioone, konstruktoritsükleid, iteratsiooniplokke ja ArrayList-teisendusi. RevEnne kasutamist vaadake genereeritud koodi õigete konstruktori argumentide ja ohutu nullväärtuste käsitlemise tagamiseks.

Võta see postitus kokku järgmiselt: