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. Javaรr Samlingsram ger 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.



