En rekke objekter i Java

โšก Smart oppsummering

En rekke objekter i Java lagrer objektreferanser i et sammenhengende spor med fast stรธrrelse, slik at en enkelt variabel kan inneholde mange forekomster av en klasse og fรฅ tilgang til hver enkelt gjennom en indeks for iterasjon, mutasjon og overfรธring til metoder.

  • ๐Ÿ“ฆ Referanselagring: Hvert spor i en Java en rekke objekter inneholder en referanse til et objekt, ikke selve objektet, pรฅ samme mรฅte som enhver objektvariabel i Java.
  • ๐Ÿงฑ To-trinns opprettelse: Tildel arrayet med new ClassName[size], og tildel deretter hvert objekt med new ClassName() fรธr du kaller metoder pรฅ det.
  • โš ๏ธ NullPointerException: Hvert spor starter som null. Kalling av en metode pรฅ et uinitialisert spor utlรธser NullPointerException under kjรธring.
  • ๐Ÿ” Iterasjon: Bruk en for-lรธkke med arraylengde eller en forbedret for-lรธkke for รฅ gรฅ gjennom alle objektene i arrayet.
  • ๐Ÿ“ Fast stรธrrelse: En array kan ikke vokse etter allokering. Bruk ArrayList nรฅr antallet objekter endres under kjรธring.
  • ๐Ÿ—๏ธ Konstruktรธrinitiering: Konstruktรธrer som sendes inline under opprettelsen gir kortere og tryggere oppsett enn post-hoc setter-kall.
  • ๐Ÿšš Metodeparameter: Nรฅr matrisen sendes til en metode, overfรธres en referanse, slik at endringer i metoden er synlige for den som kaller den.

En rekke objekter i Java

Hva er en matrise av objekter i Java?

A Java rekke objekter lagrer flere objektforekomster av samme klasse i en enkelt container med fast stรธrrelse. I motsetning til en primitiv array som lagrer verdier som int, doubleeller boolean direkte i hvert spor lagres en rekke objekter referanserHvert spor peker til minneplasseringen til et objekt, og selve objektet befinner seg pรฅ Java haug.

Dette oppsettet samsvarer med hvordan ethvert objekt variabel in Java fungerer. Arrayet grupperer ganske enkelt flere objektreferanser sammen slik at du kan fรฅ tilgang til dem via indeks. Det er det naturlige valget nรฅr antallet objekter er kjent pรฅ forhรฅnd og ikke endres i lรธpet av programmets levetid.

syntax

ClassName[] obj = new ClassName[array_length];

Hรธyresiden gir plass til array_length referanser, alle initialisert til nullIngen gjenstand for ClassName finnes ennรฅ, bare beholderen som kan inneholde referanser til slike objekter.

Slik lager du en matrise med objekter i Java

ร… opprette en fungerende array av objekter tar alltid to allokeringstrinn. Det fรธrste allokerer referansecontaineren, og det andre allokerer hvert objekt som containeren skal peke til.ping Det andre trinnet er den vanligste kilden til NullPointerException i nybegynner Java kode.

Trinn 1) ร…pne din kode redaktรธr 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);
    }
}

Trinn 2) Lagre filen som ObjectArray.java, og deretter kompilere og kjรธre den.

Trinn 3) Merk deg feilen. Prรธv รฅ feilsรธke den fรธr du fortsetter til trinn 4.

Trinn 4) Inspiser linjen Account obj[] = new Account[2];Den tildeler en matrise med to referansevariabler av typen Account, men den tildeler ingen Account gjenstander. Begge sporene holder null, og ringer obj[0].setData(...) pรฅ en null referanse kaster en NullPointerException under kjรธring.

Java Referansevariabler for objekter

Trinn 5) Fjern kommenteringen av linje 4 og 5. Disse to linjene skaper ekte Account objekter og tilordne dem til obj[0] og obj[1]Arrayet inneholder nรฅ ekte referanser, og koden kjรธrer uten problemer.

Java Matrise med objekter befolket

Utgang:

For Array Element 0
Value of a = 1
Value of b = 2
For Array Element 1
Value of a = 3
Value of b = 4

Slik initialiserer du en matrise med objekter i Java

Utover den setterbaserte initialiseringen vist ovenfor, kan en rekke objekter initialiseres pรฅ tre renere mรฅter. Hver stil bytter ut ordrikhet for klarhet, sรฅ velg den som passer best til situasjonen.

  1. Loopinitialisering โ€” alloker arrayet, gรฅ deretter gjennom hver indeks og tilordne et nytt objekt. Dette er standardmรธnsteret for store arrayer eller nรฅr objektantallet er dynamisk.
  2. Konstruktรธrinitialisering โ€” send verdier direkte til konstruktรธren ved opprettelse, slik at det ikke er behov for et separat setter-kall.
  3. Array-litteral initialisering โ€” deklarere og fylle ut i en enkelt setning med en innebygd { ... } initialisering, ideell for smรฅ faste sett.
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 standarden fordi den garanterer at det ikke er noen spor igjen nullKonstruktรธrinitialisering gjรธr intensjonen eksplisitt nรฅr hvert objekt trenger forskjellige argumenter, og array-literaler holder liten demokode kompakt. Ikke bland stiler i samme array med mindre du har en grunn: konsistens gjรธr det lettere รฅ oppdage feil.

Iterering og tilgang til elementer i en Java En rekke objekter

Nรฅr en rekke med objekter er fylt ut, dekker tre mรธnstre nesten alle tilgangsbehov. Velg lรธkkestilen som samsvarer med hvor mye kontroll koden trenger over indeksen.

Classic for slรธyfe gir tilgang til indeksen, som er nyttig for รฅ erstatte elementer, sammenligne naboer eller iterere et delomrรฅde.

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

Forbedret for slรธyfe (ยซfor-eachยป-lรธkken) skjuler indeksen og leser mer naturlig nรฅr indeksen ikke er nรธdvendig:

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

Strรธmmer (Java 8 og senere) konvertere arrayet til en pipeline, noe som er nyttig for filtrering, kartleggingping, eller aggregering uten รฅ skrive en lรธkke:

import java.util.Arrays;

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

For รฅ lese eller oppdatere et enkelt element, bruk for eksempel direkte indekstilgang obj[1].setData(10, 20)Sjekk alltid lengden fรธrst med obj.length รฅ unngรฅ ArrayIndexOutOfBoundsExceptionNรฅr et hvilket som helst spor kan vรฆre null, beskytt tilgangen med en nullkontroll eller en Optional for รฅ holde programmet i gang i stedet for รฅ krasje.

Matrise av objekter vs. Matriseliste av objekter i Java

En enkel matrise av objekter er rask og forutsigbar, men den faste stรธrrelsen blir en begrensning sรฅ snart objektantallet endres under kjรธretid. Java'S Innsamlingsramme gir ArrayList som det dynamiske alternativet. Tabellen nedenfor viser nรฅr hvert valg er passende.

TrekkEn rekke objekterArrayListe over objekter
StรธrrelseFikset ved opprettelseVokser og krymper automatisk
ErklรฆringAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Tilgangselementa[i]list.get(i)
Legg til elementStรธttes ikke etter opprettelselist.add(obj)
Type sikkerhetKompileringstidstypet av deklarasjonGeneriske elementer hรฅndheves ved kompileringstid
YtelseMarginalt raskere indekserte lesningerAmortisert O(1) tillegg, noe overhead per element
Foretrukket nรฅrStรธrrelsen er kjent og fastStรธrrelsen er ukjent eller endres under kjรธring

Bruk en array nรฅr et begrenset minneavtrykk og forutsigbar indeksering er viktig, for eksempel i matriseoppsett eller ytelseskritiske hot paths. Streik etter ArrayList i det meste av hverdagslig applikasjonskode, fordi muligheten til รฅ legge til og fjerne uten omallokering oppveier den lille overheaden per element.

Spรธrsmรฅl og svar

En rekke objekter i Java er en container med fast stรธrrelse som lagrer referanser til forekomster av samme klasse. Hver plass peker til et objekt pรฅ heapen, og elementer nรฅs via en nullbasert indeks ved hjelp av hakeparenteser.

Deklarer arrayet med ClassName[] arr = new ClassName[size], og opprett deretter hvert objekt med new ClassName() i en lรธkke eller med en innebygd arrayliteral. Begge trinnene er nรธdvendige; det fรธrste tildeler bare referanseplasser.

Fordi ny ClassName[size] bare tildeler selve arrayet. Hvert spor starter som null, sรฅ kalling av en hvilken som helst metode pรฅ det sporet kaster NullPointerException. Fiks dette ved รฅ tilordne en ny ClassName() til hver indeks fรธr bruk.

En array har en fast stรธrrelse valgt ved opprettelse, mens ArrayList vokser og krymper automatisk. Arrayer gir litt raskere indekserte lesninger; ArrayList legger til praktiske legg-til-, fjern- og strรธmmemetoder for hverdagslig applikasjonskode.

Bruk en klassisk for-lรธkke med arr.length nรฅr du trenger indeksen, eller en forbedret for-each-lรธkke for enkel iterasjon. For filtrering eller transformasjon, pakk inn arrayet med Arrays.stream(arr) og kjede sammen pipelinen du trenger.

Deklarer parameteren som ClassName[] name, og kall deretter metoden med arrayvariabelen. Java sender arrayreferansen etter verdi, slik at mutasjoner av elementfelt i metoden er synlige for den som kaller den.

Kodegeneratorer for maskinlรฆring gjenkjenner det totrinns allokeringsmรธnsteret og fullfรธrer de manglende nye ClassName()-linjene som nybegynnere glemmer. De foreslรฅr ogsรฅ ArrayList nรฅr mรฅlsamlingsstรธrrelsen er ukjent, noe som reduserer NullPointerException-feil.

Ja. GitHub Copilot genererer arraydeklarasjoner, konstruktรธrlรธkker, iterasjonsblokker og ArrayList-konverteringer fra en kommentar som beskriver domenemodellen. RevVis generert kode for korrekte konstruktรธrargumenter og sikker nullhรฅndtering fรธr bruk.

Oppsummer dette innlegget med: