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.
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.
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.
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.
- 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.
- Rakentajan alustus — välittävät arvot suoraan konstruktorille luontivaiheessa, joten erillistä setter-kutsua ei tarvita.
- 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.
| Ominaisuus | Joukko esineitä | Objektien taulukkoluettelo |
|---|---|---|
| Koko | Kiinnitetty luonnin yhteydessä | Kasvaa ja kutistuu automaattisesti |
| Ilmoitus | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Käyttöelementti | a[i] | list.get(i) |
| Lisää elementti | Ei tuettu luomisen jälkeen | list.add(obj) |
| Tyyppi turvallisuus | Käännösaikainen tyypitetty deklaraation mukaan | Geneerisiä koodeja sovelletaan käännösaikana |
| Suorituskyky | Hieman nopeammat indeksoidut lukemiset | Poistettu O(1) lisää, joitakin yleiskustannuksia elementtiä kohden |
| Edullisin, kun | Koko 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.



