Joukko esineitä sisään Java

⚡ Älykäs yhteenveto

Joukko esineitä sisään Java tallentaa objektiviittaukset kiinteän kokoiseen yhtenäiseen paikkaan, jolloin yksi muuttuja voi sisältää useita luokan instansseja ja käyttää kutakin niistä indeksin kautta iterointia, mutointia ja metodeille välittämistä varten.

  • 📦 Viitetallennustila: Jokainen paikka Java Objektitaulukko sisältää viittauksen objektiin, ei itse objektiin, samalla tavalla kuin mikä tahansa objektimuuttuja Java.
  • 🧱 Kaksivaiheinen luominen: Varaa taulukolle uusi ClassName[size] ja varaa sitten kullekin objektille uusi ClassName() ennen kuin kutsut sille metodeja.
  • ⚠️ NullPointerException: Jokainen paikka alkaa tyhjänä (null). Metodin kutsuminen alustamattomassa paikassa aiheuttaa NullPointerException-poikkeuksen (NullPointerException) suorituksen aikana.
  • 🔁 Iteraatio: Käytä for-silmukkaa taulukon pituudella tai parannettua for-silmukkaa käydäksesi läpi kaikki taulukon objektit.
  • 📏 Kiinteä koko: Taulukko ei voi kasvaa allokoinnin jälkeen. Käytä ArrayList-lauseketta, kun objektien määrä muuttuu suorituksen aikana.
  • 🏗️ Rakentajan init: Luonnin aikana rivillä välitetyt konstruktorit antavat lyhyemmän ja turvallisemman määrityksen kuin post-hoc-setter-kutsuilla.
  • 🚚 Menetelmäparametri: Taulukon välittäminen metodille siirtää viittauksen, joten metodin sisällä tehdyt muutokset näkyvät kutsujalle.

Joukko esineitä sisään Java

Mikä on objektitaulukko Java?

A Java joukko esineitä tallentaa useita saman luokan objekti-instansseja yhteen kiinteän kokoiseen säilöön. Toisin kuin alkeellinen taulukko, joka tallentaa arvoja, kuten int, doubletai boolean suoraan jokaiseen paikkaan, joukko objekteja tallentaa viittauksetJokainen paikka osoittaa objektin muistipaikkaan, ja itse objekti sijaitsee siinä. Java pino.

Tämä asettelu vastaa minkä tahansa objektin muuttuja in Java toimii. Taulukko yksinkertaisesti ryhmittelee useita objektiviittauksia yhteen, jotta voit käyttää niitä indeksin perusteella. Se on luonnollinen valinta, kun objektien lukumäärä tiedetään etukäteen eikä muutu ohjelman elinkaaren aikana.

Syntaksi

ClassName[] obj = new ClassName[array_length];

Oikea puoli varaa tilaa array_length viitteet, kaikki alustettu muotoon nullEi kohteena ClassName on vielä olemassa, vain säilö, joka voi sisältää viittauksia tällaisiin objekteihin.

Kuinka luoda objektitaulukko Java

Toimivan objektitaulukon luominen vaatii aina kaksi allokointivaihetta. Ensimmäinen allokoi viitekontin ja toinen allokoi jokaisen objektin, johon kontti osoittaa. Ohitaping toinen vaihe on yleisin yksittäinen lähde NullPointerException aloittelijana Java koodi.

Vaihe 1) Avaa sinun koodinmuokkaaja ja kopioi seuraava koodi:

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

Vaihe 2) Tallenna tiedosto ObjectArray.java, käännä ja suorita se sitten.

Vaihe 3) Huomaa virhe. Yritä korjata se ennen kuin jatkat vaiheeseen 4.

Vaihe 4) Tarkasta linja Account obj[] = new Account[2];Se allokoi taulukon, jossa on kaksi viitemuuttujaa, joiden tyyppi on Account, mutta se ei osoita mitään Account esineitä. Molemmat aukot pitävät nullja soittamalla obj[0].setData(...) on null viittaus heittää a:n NullPointerException ajonaikana.

Java Objektien viitemuuttujien taulukko

Vaihe 5) Poista kommenttirivien 4 ja 5. Nämä kaksi riviä luovat todellisia Account objekteja ja liitä ne obj[0] ja obj[1]Taulukko sisältää nyt oikeita viittauksia, ja koodi toimii moitteettomasti.

Java Täytettyjen objektien taulukko

lähtö:

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

Kuinka alustaa objektitaulukko Java

Yllä esitetyn setter-pohjaisen alustuksen lisäksi objektitaulukko voidaan alustaa kolmella siistimmällä tavalla. Jokainen tyyli vähentää selkeyden vuoksi käytettyä sanallisuutta, joten valitse tilanteeseen parhaiten sopiva.

  1. Silmukan alustus — varaa taulukko, käy läpi jokainen indeksi ja määritä uusi objekti. Tämä on vakiomalli suurille taulukoille tai kun objektien määrä on dynaaminen.
  2. Rakentajan alustus — välittävät arvot suoraan konstruktorille luontivaiheessa, joten erillistä setter-kutsua ei tarvita.
  3. Taulukon literaalin alustus — määritetään ja täytetään yhdessä lausekkeessa, jossa on rivikohtainen { ... } alustaja, ihanteellinen pienille kiinteille joukoille.
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);
    }
}

Silmukan alustus on turvallisin oletusarvo, koska se takaa, ettei yhtään paikkaa jää jäljelle. nullKonstruktorin alustus tekee tarkoituksesta eksplisiittisen, kun jokainen objekti tarvitsee eri argumentit, ja taulukkoliteraalit pitävät pienen demokoodin tiiviinä. Älä sekoita tyylejä saman taulukon sisällä, ellei sinulla ole siihen syytä: johdonmukaisuus helpottaa virheiden havaitsemista.

Elementtien iterointi ja käyttö Java Joukko esineitä

Kun objektitaulukko on täytetty, kolme mallia kattavat lähes kaikki käyttötarpeet. Valitse silmukkatyyli, joka vastaa koodin tarvitsemaa indeksin hallintaa.

Classic for silmukka antaa pääsyn indeksiin, mikä on hyödyllistä elementtien korvaamisessa, naapureiden vertailussa tai alialueen iteroinnissa.

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

Enhanced for silmukka (”for-each”-silmukka) piilottaa indeksin ja lukee luonnollisemmin, kun indeksiä ei tarvita:

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

Virrat (Java 8 ja uudemmat) muunna taulukko liukuhihnaksi, mikä on kätevää suodatusta ja kartoitusta vartenpingtai yhdistämällä ilman silmukan kirjoittamista:

import java.util.Arrays;

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

Yksittäisen elementin lukemiseen tai päivittämiseen käytetään esimerkiksi suoraa indeksikäyttöä. obj[1].setData(10, 20)Tarkista aina ensin pituus obj.length välttää ArrayIndexOutOfBoundsExceptionKun mikä tahansa paikka voisi olla null, suojaa pääsyä null-tarkistuksella tai Optional jotta ohjelma pysyisi käynnissä kaatumisen sijaan.

Objektitaulukko vs. Objektiluettelo Java

Yksinkertainen objektitaulukko on nopea ja ennustettava, mutta sen kiinteästä koosta tulee rajoitus heti, kun objektien määrä muuttuu suorituksen aikana. Java'S Kokoelmien puitteet tarjoaa ArrayList dynaamisena vaihtoehtona. Alla oleva taulukko korostaa, milloin kukin vaihtoehto on sopiva.

OminaisuusJoukko esineitäObjektien taulukkoluettelo
KokoKiinnitetty luonnin yhteydessäKasvaa ja kutistuu automaattisesti
IlmoitusAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Käyttöelementtia[i]list.get(i)
Lisää elementtiEi tuettu luomisen jälkeenlist.add(obj)
Tyyppi turvallisuusKäännösaikainen tyypitetty deklaraation mukaanGeneerisiä koodeja sovelletaan käännösaikana
SuorituskykyHieman nopeammat indeksoidut lukemisetPoistettu O(1) lisää, joitakin yleiskustannuksia elementtiä kohden
Edullisin, kunKoko on tiedossa ja kiinteäKoko on tuntematon tai muuttuu suorituksen aikana

Käytä taulukkoa, kun pieni muistin käyttö ja ennustettava indeksointi ovat tärkeitä, esimerkiksi matriisiasetteluissa tai suorituskykykriittisissä hot path -poluissa. ArrayList useimmissa jokapäiväisissä sovelluskoodeissa, koska kyky lisätä ja poistaa ilman uudelleenallokointia on suurempi kuin pieni elementtikohtainen lisäkustannus.

UKK

Joukko objekteja Java on kiinteän kokoinen säilö, joka tallentaa viittauksia saman luokan instansseihin. Jokainen paikka osoittaa keossa olevaan objektiin, ja elementteihin päästään käsiksi nollapohjaisen indeksin avulla hakasulkeissa.

Määrittele taulukko ClassName[] arr = new ClassName[size] -funktiolla ja luo sitten jokainen objekti new ClassName() -funktiolla silmukassa tai käyttämällä taulukon rivillä olevaa literaalia. Molemmat vaiheet ovat pakollisia; ensimmäinen varaa vain viittauspaikkoja.

Koska new ClassName[size] varaa vain itse taulukon. Jokainen paikka alkaa tyhjänä, joten minkä tahansa metodin kutsuminen kyseisessä paikassa aiheuttaa NullPointerException-poikkeuksen. Korjaa tämä määrittämällä uusi ClassName() jokaiselle indeksille ennen käyttöä.

Taulukolla on kiinteä koko, joka valitaan luomisen yhteydessä, kun taas ArrayList kasvaa ja kutistuu automaattisesti. Taulukot tarjoavat hieman nopeamman indeksoidun lukemisen; ArrayList lisää käteviä lisäys-, poisto- ja suoratoistometodeja jokapäiväiseen sovelluskoodiin.

Käytä klassista for-silmukkaa arr.length-metodilla, kun tarvitset indeksin, tai parannettua for-each-silmukkaa yksinkertaiseen iterointiin. Suodatusta tai muuntamista varten kääri taulukko Arrays.stream(arr)-metodilla ja ketjuta tarvitsemasi liukuhihna.

Määrittele parametri muodossa ClassName[] nimi ja kutsu sitten metodia taulukkomuuttujalla. Java välittää taulukkoviittauksen arvon mukaan, joten metodin sisällä olevien elementtikenttien muutokset näkyvät kutsujalle.

Koneoppimiskoodin generaattorit tunnistavat kaksivaiheisen allokointimallin ja täydentävät aloittelijoiden unohtamat puuttuvat uudet ClassName()-rivit. Ne ehdottavat myös ArrayList-lauseketta, kun kohdekokoelman koko on tuntematon, mikä vähentää NullPointerException-virheitä.

Kyllä. GitHub Copilot luo taulukkomäärittelyjä, konstruktorisilmukoita, iteraatiolohkoja ja ArrayList-muunnoksia toimialuemallia kuvaavasta kommentista. Revview-koodin luonti oikeiden konstruktoriargumenttien ja turvallisen null-käsittelyn varmistamiseksi ennen käyttöä.

Tiivistä tämä viesti seuraavasti: