Objektumok tömbje Java

⚡ Okos összefoglaló

Objektumok tömbje Java Az objektumhivatkozásokat egy fix méretű, összefüggő tárolóhelyen tárolja, lehetővé téve, hogy egyetlen változó egy osztály számos példányát tárolja, és mindegyikhez egy indexen keresztül férjen hozzá iteráció, mutáció és metódusoknak való átadás céljából.

  • 📦 Referenciatárolás: Minden egyes nyílás egy Java Az objektumtömbök egy objektumra mutató hivatkozást tartalmaznak, nem magára az objektumra, hasonlóan bármely objektumváltozóhoz a Java.
  • 🧱 Kétlépéses létrehozás: Foglald le a tömböt az új Osztálynév[méret] függvénnyel, majd minden objektumhoz foglalj le új Osztálynév() függvénnyel, mielőtt metódusokat hívnál rájuk.
  • ⚠️ NullPointerKivétel: Minden slot nullként indul. Egy nem inicializált sloton meghívott metódus futásidőben NullPointerException kivételt okoz.
  • 🔁 Ismétlés: Használj tömbhosszal rendelkező for ciklust vagy egy továbbfejlesztett for ciklust a tömb összes objektumának bejárására.
  • 📏 Fix méret: Egy tömb nem növekedhet lefoglalás után. Használj ArrayList-et, ha az objektumok száma futásidőben változik.
  • 🏗️ Konstruktor init: A létrehozás során soronként átadott konstruktorok rövidebb és biztonságosabb beállítást biztosítanak, mint a post-hoc setter hívások.
  • 🚚 Metódus paraméter: A tömb metódusnak való átadása egy referenciát hoz létre, így a metóduson belüli változások láthatók a hívó számára.

Objektumok tömbje Java

Mi az objektumok tömbje a Java?

A Java objektumok tömbje ugyanazon osztály több objektumpéldányát tárolja egyetlen fix méretű konténerben. Ellentétben egy primitív tömbbel, amely olyan értékeket tárol, mint például int, doublevagy boolean közvetlenül minden egyes nyílásban egy objektumtömb tárolja referenciákMinden slot egy objektum memóriahelyére mutat, és maga az objektum a Java halom.

Ez az elrendezés illeszkedik bármely objektumhoz változó in Java működik. A tömb egyszerűen több objektumhivatkozást csoportosít, így index alapján lehet elérni őket. Ez a természetes választás, ha az objektumok száma előre ismert, és nem változik a program élettartama alatt.

Szintaxis

ClassName[] obj = new ClassName[array_length];

A jobb oldal helyet biztosít a következőknek: array_length hivatkozások, mindegyik inicializálva nullNem tárgya ClassName még nem létezik, csak az a konténer, amely az ilyen objektumokra mutató hivatkozásokat tárolhatja.

Hogyan hozzunk létre objektumtömböt a Java

Egy objektumokból álló működő tömb létrehozása mindig két lefoglalási lépésből áll. Az első lefoglalás a referencia konténert foglalja le, a második pedig az összes olyan objektumot, amelyre a konténer mutatni fog. Skipping a második lépés a leggyakoribb forrás NullPointerException kezdőként Java kód.

Step 1) Nyissa meg a kódszerkesztő és másold be a következő kódot:

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) Mentse a fájlt ObjectArray.java, majd fordítsd le és futtasd.

Step 3) Jegyezd fel a hibát. Próbáld meg kijavítani, mielőtt folytatod a 4. lépéssel.

Step 4) Vizsgálja meg a vonalat Account obj[] = new Account[2];Két, a következő típusú referenciaváltozóból álló tömböt foglal le: Account, de nem oszt ki semmilyen Account tárgyak. Mindkét nyílás null, és hívás obj[0].setData(...) a null a referencia dob egy NullPointerException futásidőben.

Java Objektumok referenciaváltozóinak tömbje

Step 5) Töröld ki a 4. és 5. sor kommentjeit. Ez a két sor valós értékeket hoz létre. Account objektumok és hozzárendelésük obj[0] és a obj[1]A tömb most már valós hivatkozásokat tartalmaz, és a kód tisztán fut.

Java Objektumok tömbje feltöltve

output:

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

Hogyan inicializáljunk egy objektumtömböt a Java

A fent bemutatott szetter alapú inicializáláson túl egy objektumtömb három letisztultabb módon is inicializálható. Mindegyik stílus a részletességet a jobb érthetőség kedvéért használja, ezért válassza azt, amelyik a legjobban illik a helyzethez.

  1. Ciklus inicializálás — lefoglalja a tömböt, majd végigjárja az egyes indexeket, és új objektumot rendel hozzá. Ez a szabványos minta nagy tömbök esetén, vagy amikor az objektumok száma dinamikus.
  2. Konstruktor inicializálása — létrehozáskor közvetlenül a konstruktornak adja át az értékeket, így nincs szükség külön setter hívásra.
  3. Tömb literál inicializálása — egyetlen utasításban deklarálható és kitölthető egy soronkénti { ... } inicializáló, ideális kis fix halmazokhoz.
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);
    }
}

A ciklus inicializálása a legbiztonságosabb alapértelmezett beállítás, mivel garantálja, hogy nem marad üres hely. nullA konstruktor inicializálása explicitté teszi a szándékot, amikor minden objektumnak különböző argumentumokra van szüksége, a tömbliterálok pedig a kis demókódokat tömören tartják. Ne keverj stílusokat ugyanazon tömbön belül, hacsak nincs rá okod: a következetesség megkönnyíti a hibák észrevételét.

Elemek iterálása és elérése egy Java Objektumok tömbje

Miután egy objektumtömböt feltöltöttünk, három minta szinte minden hozzáférési igényt lefed. Válassza ki azt a ciklusstílust, amely megfelel a kód index feletti irányításának mértékének.

Klasszikus - Classic for hurok hozzáférést biztosít az indexhez, ami hasznos elemek cseréjéhez, szomszédok összehasonlításához vagy egy résztartomány iterálásához.

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

Megerősített for hurok (a „for-each” ciklus) elrejti az indexet, és természetesebben olvasható, amikor az indexre nincs szükség:

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

Patakok (Java 8-as és későbbi) a tömböt pipeline-ná alakítja, ami hasznos a szűréshez, a leképezéshezping, vagy ciklusírás nélküli aggregálás:

import java.util.Arrays;

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

Egyetlen elem olvasásához vagy frissítéséhez használjon közvetlen indexhozzáférést, például obj[1].setData(10, 20)Mindig először ellenőrizze a hosszát obj.length elkerülni ArrayIndexOutOfBoundsExceptionAmikor bármelyik nyílás lehetne null, védje a hozzáférést null ellenőrzéssel vagy egy Optional hogy a program futni tudjon ahelyett, hogy összeomlana.

Objektumok tömbje vs. Objektumok ArrayList-je a következőben: Java

Egy egyszerű objektumtömb gyors és kiszámítható, de a fix mérete korlátozássá válik, amint az objektumok száma futásidőben megváltozik. JavaA Gyűjtemények keretrendszere biztosítja ArrayList dinamikus alternatívaként. Az alábbi táblázat kiemeli, hogy mikor megfelelő az egyes lehetőségek.

JellemzőObjektumok tömbjeObjektumok tömblistája
MéretLétrehozáskor rögzítveAutomatikusan növekszik és zsugorodik
NyilatkozatAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Hozzáférési elema[i]list.get(i)
Elem hozzáadásaLétrehozás után nem támogatottlist.add(obj)
TípusbiztonságFordítási idejű típus deklaráció szerintFordítási időben érvényesített generikusok
TeljesítményKissé gyorsabb indexelt olvasásokAmortizált O(1) hozzáadott érték, elemenként némi általános költség
Előnyben részesített, amikorA méret ismert és fixA méret ismeretlen vagy futásidőben változik

Használjon tömböt, ha a szűkös memória-lábnyom és a kiszámítható indexelés számít, például mátrixelrendezések vagy teljesítménykritikus gyors elérési utak esetén. ArrayList a legtöbb mindennapi alkalmazáskódban, mivel az újraelosztás nélküli hozzáadási és eltávolítási lehetőség meghaladja az elemenkénti kis többletköltségeket.

GYIK

Objektumok tömbje Java egy fix méretű konténer, amely ugyanazon osztály példányaira mutató hivatkozásokat tárol. Minden egyes slot a heap egy objektumára mutat, és az elemekhez nulla alapú index segítségével, szögletes zárójelben lehet hozzáférni.

Deklaráld a tömböt a ClassName[] arr = new ClassName[size] függvénnyel, majd hozd létre az egyes objektumokat a new ClassName() függvénnyel egy ciklusban vagy egy beágyazott tömbliterállal. Mindkét lépés szükséges; az első csak referencia-helyeket foglal le.

Mivel az új ClassName[méret] csak magát a tömböt foglalja le. Minden slot nullként indul, így bármely metódus meghívása ezen a sloton NullPointerException kivételt dob. Javítsd ki úgy, hogy minden indexhez új ClassName()-t rendelsz használat előtt.

Egy tömb mérete fix, és a létrehozáskor kerül kiválasztásra, míg az ArrayList automatikusan növekszik és zsugorodik. A tömbök valamivel gyorsabb indexelt olvasást biztosítanak; az ArrayList pedig kényelmes hozzáadás, eltávolítás és streamelési metódusokat biztosít a mindennapi alkalmazáskódokhoz.

Használj klasszikus for ciklust arr.length függvénnyel, ha az indexre van szükséged, vagy egy továbbfejlesztett for-each ciklust az egyszerű iterációhoz. Szűréshez vagy transzformációhoz tekerd be a tömböt Arrays.stream(arr) függvénnyel, és láncold össze a szükséges pipeline-t.

Deklaráld a paramétert ClassName[] névként, majd hívd meg a metódust a tömbváltozóval. Java érték alapján adja át a tömbreferenciát, így a metóduson belüli elemmezők mutációi láthatók a hívó számára.

A gépi tanulást segítő kódgenerátorok felismerik a kétlépéses allokációs mintát, és kiegészítik a hiányzó új ClassName() sorokat, amelyeket a kezdők elfelejtenek. ArrayList-et is javasolnak, ha a célgyűjtemény mérete ismeretlen, csökkentve ezzel a NullPointerException hibákat.

Igen. A GitHub Copilot tömbdeklarációkat, konstruktor ciklusokat, iterációs blokkokat és ArrayList konverziókat generál a domain modellt leíró megjegyzésből. RevHasználat előtt nézze meg a generált kódot a konstruktor argumentumok helyessége és a biztonságos nullkezelés érdekében.

Foglald össze ezt a bejegyzést a következőképpen: