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.

  • ๐Ÿ“ฆ Referenslagring: Varje plats i en Java en array av objekt innehรฅller en referens till ett objekt, inte sjรคlva objektet, ungefรคr som vilken objektvariabel som helst i Java.
  • ๐Ÿงฑ Skapande i tvรฅ steg: Allokera arrayen med new ClassName[size] och allokera sedan varje objekt med new ClassName() innan du anropar metoder pรฅ det.
  • โš ๏ธ NullPointerException: Varje plats bรถrjar som null. Att anropa en metod pรฅ en oinitialiserad plats utlรถser NullPointerException vid kรถrning.
  • ๐Ÿ” Iteration: Anvรคnd en for-loop med arraylรคngd eller en fรถrbรคttrad for-loop fรถr att gรฅ igenom varje objekt i arrayen.
  • ๐Ÿ“ Fast storlek: En array kan inte vรคxa efter allokering. Anvรคnd ArrayList nรคr antalet objekt รคndras vid kรถrning.
  • ๐Ÿ—๏ธ Konstruktorns init: Konstruktorer som skickas inline under skapandet ger kortare och sรคkrare installationer รคn post-hoc setter-anrop.
  • ๐Ÿšš Metodparameter: Att skicka arrayen till en metod รถverfรถr en referens, sรฅ รคndringar inuti metoden รคr synliga fรถr anroparen.

Array av objekt i Java

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.

Java Referensvariabler fรถr objektmatris

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.

Java Matris med objekt ifylld

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.

  1. 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.
  2. Konstruktorinitialisering โ€” skicka vรคrden direkt till konstruktorn vid skapandetillfรคllet sรฅ att inget separat setter-anrop behรถvs.
  3. 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.

LeveransArray av objektArrayLista med objekt
Storlekร…tgรคrdat vid skapandetVรคxer och krymper automatiskt
FรถrklaringAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
ร…tkomstelementa[i]list.get(i)
Lรคgg till elementStรถds inte efter skapandetlist.add(obj)
Typ av sรคkerhetKompileringstid typad av deklarationGeneriska instรคllningar tillรคmpas vid kompileringstid
PrestandaMarginellt snabbare indexerade lรคsningarAmorterad O(1)-tillรคgg, viss omkostnader per element
Fรถredras nรคrStorleken รคr kรคnd och fastStorleken รค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.

Vanliga frรฅgor

En uppsรคttning objekt i Java รคr en container med fast storlek som lagrar referenser till instanser av samma klass. Varje plats pekar pรฅ ett objekt pรฅ heapen, och element nรฅs via ett nollbaserat index med hjรคlp av hakparenteser.

Deklarera arrayen med ClassName[] arr = new ClassName[size], och skapa sedan varje objekt med new ClassName() i en loop eller med en inline array-literal. Bรฅda stegen krรคvs; det fรถrsta allokerar endast referensplatser.

Eftersom new ClassName[size] bara allokerar sjรคlva arrayen. Varje plats bรถrjar som null, sรฅ att anrop av valfri metod pรฅ den platsen utlรถser NullPointerException. ร…tgรคrda det genom att tilldela ett new ClassName() till varje index fรถre anvรคndning.

En array har en fast storlek som vรคljs vid skapandet, medan ArrayList vรคxer och krymper automatiskt. Arrayer ger nรฅgot snabbare indexerade lรคsningar; ArrayList lรคgger till praktiska metoder fรถr att lรคgga till, ta bort och strรถmma fรถr vardaglig applikationskod.

Anvรคnd en klassisk for-loop med arr.length nรคr du behรถver indexet, eller en fรถrbรคttrad for-each-loop fรถr enkel iteration. Fรถr filtrering eller transformation, linda in arrayen med Arrays.stream(arr) och kedja den pipeline du behรถver.

Deklarera parametern som ClassName[] name och anropa sedan metoden med arrayvariabeln. Java skickar arrayreferensen efter vรคrde, sรฅ mutationer av elementfรคlt inuti metoden รคr synliga fรถr anroparen.

Kodgeneratorer fรถr maskininlรคrning kรคnner igen tvรฅstegsallokeringsmรถnstret och kompletterar de saknade nya ClassName()-raderna som nybรถrjare glรถmmer. De fรถreslรฅr ocksรฅ ArrayList nรคr mรฅlsamlingens storlek รคr okรคnd, vilket minskar NullPointerException-buggar.

Ja. GitHub Copilot genererar arraydeklarationer, konstruktorloopar, iterationsblock och ArrayList-konverteringar frรฅn en kommentar som beskriver domรคnmodellen. RevVisa genererad kod fรถr korrekta konstruktorargument och sรคker nullhantering fรถre anvรคndning.

Sammanfatta detta inlรคgg med: