Array av objekt i Java
⚡ Smart sammanfattning
Array av objekt i Java lagrar objektreferenser i en sammanhängande plats med fast storlek, vilket låter en enda variabel innehålla många instanser av en klass och komma åt var och en via ett index för iteration, mutation och överföring till metoder.
Vad är en array av objekt i Java?
A Java mängd objekt lagrar flera objektinstanser av samma klass i en enda container med fast storlek. Till skillnad från en primitiv array som lagrar värden som int, double, eller boolean direkt i varje plats lagras en matris med objekt referenserVarje plats pekar på ett objekts minnesplats, och själva objektet finns på Java hög.
Den här layouten matchar hur vilket objekt som helst variabel in Java fungerar. Arrayen grupperar helt enkelt flera objektreferenser så att du kan komma åt dem via index. Det är det naturliga valet när antalet objekt är känt i förväg och inte ändras under programmets livstid.
syntax
ClassName[] obj = new ClassName[array_length];
Höger sida avsätter utrymme för array_length referenser, alla initialiserade till nullInget föremål för ClassName finns ännu, bara behållaren som kan innehålla referenser till sådana objekt.
Hur man skapar en array av objekt i Java
Att skapa en fungerande array av objekt tar alltid två allokeringssteg. Det första allokerar referensbehållaren, och det andra allokerar varje objekt som behållaren ska peka på.ping Det andra steget är den enskilt vanligaste källan till NullPointerException i nybörjarklass Java koda.
Steg 1) Öppna kodredigerare och kopiera följande kod:
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); } }
Steg 2) Spara filen som ObjectArray.java, och sedan kompilera och köra det.
Steg 3) Notera felet. Försök att felsöka det innan du fortsätter till steg 4.
Steg 4) Inspektera linjen Account obj[] = new Account[2];Den allokerar en array med två referensvariabler av typen Account, men den allokerar inte någon Account föremål. Båda hålen rymmer nulloch ringer obj[0].setData(...) på en null referens kastar en NullPointerException vid körning.
Steg 5) Avkommentera rad 4 och 5. Dessa två rader skapar verkliga Account objekt och tilldela dem till obj[0] och obj[1]Arrayen innehåller nu riktiga referenser och koden körs utan problem.
Produktion:
For Array Element 0 Value of a = 1 Value of b = 2 For Array Element 1 Value of a = 3 Value of b = 4
Hur man initierar en array av objekt i Java
Utöver den setter-baserade initialiseringen som visas ovan kan en array av objekt initialiseras på tre enklare sätt. Varje stil byter ut ordrikhet för tydlighet, så välj den som bäst passar situationen.
- Loopinitialisering — allokera arrayen, gå sedan igenom varje index och tilldela ett nytt objekt. Detta är standardmönstret för stora arrayer eller när objektantalet är dynamiskt.
- Konstruktorinitialisering — skicka värden direkt till konstruktorn vid skapandetillfället så att inget separat setter-anrop behövs.
- Array literal initialisering — deklarera och fyll i i ett enda uttalande med en inline-kod
{ ... }initialiserare, idealisk för små fasta uppsättningar.
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); } }
Loopinitiering är den säkraste standardinställningen eftersom den garanterar att ingen plats finns kvar nullKonstruktorinitialisering gör avsikten explicit när varje objekt behöver olika argument, och arrayliteraler håller liten demokod kompakt. Blanda inte stilar inom samma array om du inte har en anledning: konsekvens gör det lättare att upptäcka buggar.
Iterera och komma åt element i en Java Array av objekt
När en array med objekt är ifylld täcker tre mönster nästan alla åtkomstbehov. Välj den loopstil som matchar hur mycket kontroll koden behöver över indexet.
Klassisk for slinga ger åtkomst till indexet, vilket är användbart för att ersätta element, jämföra grannar eller iterera ett delområde.
for (int i = 0; i < obj.length; i++) { System.out.println("Element " + i); obj[i].showData(); }
Förbättrad for slinga (loopen ”for-each”) döljer indexet och läser mer naturligt när indexet inte behövs:
for (Account acc : obj) {
acc.showData();
}
Strömmar (Java 8 och senare) konvertera arrayen till en pipeline, vilket är praktiskt för filtrering, mappningping, eller aggregera utan att skriva en loop:
import java.util.Arrays;
Arrays.stream(obj)
.filter(acc -> acc.a > 0)
.forEach(Account::showData);
För att läsa eller uppdatera ett enskilt element, använd direkt indexåtkomst, till exempel obj[1].setData(10, 20)Kontrollera alltid längden först med obj.length att undvika ArrayIndexOutOfBoundsExceptionNär vilken plats som helst kan vara null, skydda åtkomsten med en nullkontroll eller en Optional för att hålla programmet igång istället för att krascha.
Matris av objekt vs. Matrislista av objekt i Java
En vanlig array av objekt är snabb och förutsägbar, men dess fasta storlek blir en begränsning så snart objektantalet ändras vid körning. Javas ramverk för samlingar tillhandahåller ArrayList som det dynamiska alternativet. Tabellen nedan visar när varje alternativ är lämpligt.
| Leverans | Array av objekt | ArrayLista med objekt |
|---|---|---|
| Storlek | Åtgärdat vid skapandet | Växer och krymper automatiskt |
| Förklaring | Account[] a = new Account[5]; | List<Account> list = new ArrayList<>(); |
| Åtkomstelement | a[i] | list.get(i) |
| Lägg till element | Stöds inte efter skapandet | list.add(obj) |
| Typ av säkerhet | Kompileringstid typad av deklaration | Generiska inställningar tillämpas vid kompileringstid |
| Prestanda | Marginellt snabbare indexerade läsningar | Amorterad O(1)-tillägg, viss omkostnader per element |
| Föredras när | Storleken är känd och fast | Storleken är okänd eller ändras vid körning |
Använd en array när ett begränsat minnesutrymme och förutsägbar indexering är viktiga, till exempel i matrislayouter eller prestandakritiska hot paths. Sträck dig efter ArrayList i den mesta vardagliga applikationskod, eftersom möjligheten att lägga till och ta bort utan omallokering uppväger den lilla overhead per element.



