Array af objekter i Java

⚡ Smart opsummering

Array af objekter i Java lagrer objektreferencer i et sammenhængende slot med fast størrelse, hvilket lader en enkelt variabel indeholde mange instanser af en klasse og tilgå hver enkelt via et indeks til iteration, mutation og videregivelse til metoder.

  • 📦 Referencelagring: Hver plads i en Java et array af objekter indeholder en reference til et objekt, ikke selve objektet, ligesom enhver objektvariabel i Java.
  • 🧱 Oprettelse i to trin: Tildel arrayet new ClassName[size], og tildel derefter hvert objekt new ClassName(), før du kalder metoder på det.
  • ⚠️ NullPointerException: Hvert slot starter som null. Kald af en metode på et ikke-initialiseret slot udløser en NullPointerException under kørsel.
  • 🔁 Gentagelse: Brug en for-løkke med array-længde eller en forbedret for-løkke til at gennemgå alle objekter i arrayet.
  • 📏 Fast størrelse: Et array kan ikke vokse efter allokering. Brug ArrayList, når antallet af objekter ændres under kørsel.
  • 🏗️ Konstruktørinitial: Konstruktører, der sendes inline under oprettelsen, giver en kortere og mere sikker opsætning end post-hoc setter-kald.
  • 🚚 Metodeparameter: Når arrayet overføres til en metode, overføres en reference, så ændringer i metoden er synlige for den, der kalder den.

Array af objekter i Java

Hvad er et array af objekter i Java?

A Java række af objekter lagrer flere objektinstanser af samme klasse i en enkelt container med fast størrelse. I modsætning til et primitivt array, der lagrer værdier som f.eks. int, double eller boolean direkte i hvert slot lagres en række objekter referencerHvert slot peger på et objekts hukommelsesplacering, og selve objektet findes på Java bunke.

Dette layout matcher, hvordan ethvert objekt variabel in Java fungerer. Arrayet grupperer simpelthen flere objektreferencer sammen, så du kan tilgå dem via indeks. Det er det naturlige valg, når antallet af objekter er kendt på forhånd og ikke ændrer sig i løbet af programmets levetid.

Syntaks

ClassName[] obj = new ClassName[array_length];

Højre side giver plads til array_length referencer, alle initialiseret til nullIntet objekt af ClassName findes endnu, kun den container, der kan indeholde referencer til sådanne objekter.

Sådan opretter du et array af objekter i Java

Oprettelse af et fungerende array af objekter tager altid to allokeringstrin. Det første allokerer referencecontaineren, og det andet allokerer hvert objekt, som containeren skal pege på. Spring overping Det andet trin er den mest almindelige kilde til NullPointerException hos begyndere Java kode.

Trin 1) Åbn din kode editor og kopier følgende kode:

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);
    }
}

Trin 2) Gem filen som ObjectArray.java, og kompiler og kør det derefter.

Trin 3) Bemærk fejlen. Prøv at foretage en fejlfinding, før du fortsætter til trin 4.

Trin 4) Inspicer linjen Account obj[] = new Account[2];Den allokerer et array af to referencevariabler af typen Account, men den tildeler ikke nogen Account genstande. Begge åbninger holder null, og ringer obj[0].setData(...) på en null reference kaster en NullPointerException ved kørsel.

Java Array af objekter referencevariabler

Trin 5) Fjern kommentar fra linje 4 og 5. Disse to linjer skaber reelle Account objekter og tildel dem til obj[0] og obj[1]Arrayet indeholder nu reelle referencer, og koden kører uden problemer.

Java Array af objekter udfyldt

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

Sådan initialiserer du et array af objekter i Java

Ud over den setter-baserede initialisering vist ovenfor, kan en række objekter initialiseres på tre mere overskuelige måder. Hver stil bytter ordgængelighed ud med klarhed, så vælg den, der bedst passer til situationen.

  1. Loopinitialisering — alloker arrayet, gennemgå derefter hvert indeks og tildel et nyt objekt. Dette er standardmønsteret for store arrays eller når objektantallet er dynamisk.
  2. Konstruktørinitialisering — send værdier direkte til konstruktøren på oprettelsestidspunktet, så der ikke er behov for et separat setter-kald.
  3. Array literal initialisering — deklarere og udfylde i en enkelt sætning med en inline { ... } initialisering, ideel til små faste sæt.
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);
    }
}

Loopinitialisering er den sikreste standard, fordi den garanterer, at der ikke er nogen plads tilbage nullKonstruktørinitialisering gør intentionen eksplicit, når hvert objekt kræver forskellige argumenter, og array-literaler holder lille demokode kompakt. Bland ikke stilarter inden for det samme array, medmindre du har en grund: konsistens gør det lettere at få øje på fejl.

Iterering og adgang til elementer i en Java Array af objekter

Når et array af objekter er udfyldt, dækker tre mønstre næsten ethvert adgangsbehov. Vælg den løkkestil, der matcher, hvor meget kontrol koden har brug for over indekset.

klassisk for loop giver adgang til indekset, hvilket er nyttigt til at erstatte elementer, sammenligne naboer eller iterere et underområde.

for (int i = 0; i < obj.length; i++) {
    System.out.println("Element " + i);
    obj[i].showData();
}

Udvidet for loop ("for-each"-løkken) skjuler indekset og læser mere naturligt, når indekset ikke er nødvendigt:

for (Account acc : obj) {
    acc.showData();
}

Strømme (Java 8 og senere) konverter arrayet til en pipeline, hvilket er praktisk til filtrering, kortlægningping, eller aggregering uden at skrive en løkke:

import java.util.Arrays;

Arrays.stream(obj)
      .filter(acc -> acc.a > 0)
      .forEach(Account::showData);

For at læse eller opdatere et enkelt element skal du bruge direkte indeksadgang, for eksempel obj[1].setData(10, 20)Kontroller altid længden først med obj.length at undgå ArrayIndexOutOfBoundsExceptionNår en hvilken som helst plads kunne være null, beskyt adgangen med en null-kontrol eller en Optional for at holde programmet kørende i stedet for at det går ned.

Array af objekter vs. ArrayListe af objekter i Java

Et almindeligt array af objekter er hurtigt og forudsigeligt, men dets faste størrelse bliver en begrænsning, så snart objektantallet ændres under kørsel. Java's Indsamlingsramme giver ArrayList som det dynamiske alternativ. Tabellen nedenfor fremhæver, hvornår hvert valg er passende.

FeatureArray af objekterArrayListe over objekter
StørrelseRettet ved oprettelseVokser og krymper automatisk
ErklæringAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Adgangselementa[i]list.get(i)
Tilføj elementIkke understøttet efter oprettelselist.add(obj)
Type sikkerhedKompileringstid indtastet af deklarationGeneriske elementer håndhæves ved kompileringstid
YdeevneMarginalt hurtigere indekserede læsningerAmortiseret O(1) tilføjelse, noget overhead pr. element
Foretrukket nårStørrelsen er kendt og fastlagtStørrelsen er ukendt eller ændres under kørsel

Brug et array, når et begrænset hukommelsesfodaftryk og forudsigelig indeksering er vigtige, for eksempel i matrixlayouts eller ydeevnekritiske hot paths. ArrayList i det meste hverdagsapplikationskode, fordi muligheden for at tilføje og fjerne uden omallokering opvejer den lille overhead pr. element.

Ofte Stillede Spørgsmål

En række objekter i Java er en container med fast størrelse, der lagrer referencer til instanser af samme klasse. Hvert slot peger på et objekt på heapen, og elementer tilgås via et nulbaseret indeks ved hjælp af firkantede parenteser.

Deklarer arrayet med ClassName[] arr = new ClassName[size], og opret derefter hvert objekt med new ClassName() i en løkke eller med en inline array-literal. Begge trin er påkrævede; det første allokerer kun referencepladser.

Fordi new ClassName[size] kun allokerer selve arrayet. Hvert slot starter som null, så kald af en hvilken som helst metode på det slot udløser en NullPointerException. Ret det ved at tildele et new ClassName() til hvert indeks før brug.

Et array har en fast størrelse valgt ved oprettelsen, mens ArrayList vokser og krymper automatisk. Arrays giver lidt hurtigere indekserede læsninger; ArrayList tilføjer praktiske tilføj-, fjern- og strømningsmetoder til hverdagsapplikationskode.

Brug en klassisk for-løkke med arr.length, når du har brug for indekset, eller en forbedret for-each-løkke til simpel iteration. For filtrering eller transformation skal du pakke arrayet ind med Arrays.stream(arr) og sammenkæde den pipeline, du har brug for.

Deklarer parameteren som ClassName[] name, og kald derefter metoden med arrayvariablen. Java sender array-referencen efter værdi, så mutationer af elementfelter i metoden er synlige for den, der kalder den.

Kodegeneratorer til maskinlæring genkender det totrinsbaserede allokeringsmønster og fuldfører de manglende nye ClassName()-linjer, som begyndere glemmer. De foreslår også ArrayList, når målsamlingens størrelse er ukendt, hvilket reducerer NullPointerException-fejl.

Ja. GitHub Copilot genererer array-deklarationer, konstruktørløkker, iterationsblokke og ArrayList-konverteringer fra en kommentar, der beskriver domænemodellen. RevVis genereret kode for korrekte konstruktørargumenter og sikker nullhåndtering før brug.

Opsummer dette indlæg med: