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.
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.
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.
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.
- 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.
- Konstruktori initsialiseerimine — edastavad väärtused loomise ajal otse konstruktorile, seega pole vaja eraldi setter-kutset.
- 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.
| tunnusjoon | Objektide massiiv | Objektide massiiviloend |
|---|---|---|
| Mõõt | Fikseeritud loomisel | Kasvab ja kahaneb automaatselt |
| deklaratsioon | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Juurdepääsuelement | a[i] | list.get(i) |
| Lisa element | Pärast loomist ei toetata | list.add(obj) |
| Tüübi ohutus | Kompileerimise ajal tüübitud deklaratsiooni järgi | Kompileerimise ajal jõustatavad geneerilised koodid |
| jõudlus | Veidi kiiremad indekseeritud lugemised | Amortiseeritud O(1) lisakulud, teatud üldkulud elemendi kohta |
| Eelistatud siis, kui | Suurus on teada ja fikseeritud | Suurus 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.



