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. Javas ramverk för samlingar tillhandahåller 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: