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.
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.
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.
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.
- 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.
- 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.
- 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ömbje | Objektumok tömblistája |
|---|---|---|
| Méret | Létrehozáskor rögzítve | Automatikusan növekszik és zsugorodik |
| Nyilatkozat | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Hozzáférési elem | a[i] | list.get(i) |
| Elem hozzáadása | Létrehozás után nem támogatott | list.add(obj) |
| Típusbiztonság | Fordítási idejű típus deklaráció szerint | Fordítási időben érvényesített generikusok |
| Teljesítmény | Kissé gyorsabb indexelt olvasások | Amortizált O(1) hozzáadott érték, elemenként némi általános költség |
| Előnyben részesített, amikor | A méret ismert és fix | A 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.



