Serie di oggetti in Java

โšก Riepilogo intelligente

Serie di oggetti in Java Memorizza i riferimenti agli oggetti in uno slot contiguo di dimensioni fisse, consentendo a una singola variabile di contenere molte istanze di una classe e di accedere a ciascuna di esse tramite un indice per iterare, modificare e passare ai metodi.

  • ๐Ÿ“ฆ Archiviazione di riferimento: Ogni slot in un Java un array di oggetti contiene un riferimento a un oggetto, non all'oggetto stesso, in modo simile a qualsiasi variabile oggetto in Java.
  • ๐Ÿงฑ Creazione in due fasi: Alloca l'array con new ClassName[size], quindi alloca ciascun oggetto con new ClassName() prima di chiamare i metodi su di esso.
  • โš ๏ธ NullPointerException: Ogni slot inizia come null. La chiamata di un metodo su uno slot non inizializzato genera un'eccezione NullPointerException in fase di esecuzione.
  • ๐Ÿ” Iterazione: Utilizza un ciclo for con la lunghezza dell'array o un ciclo for avanzato per scorrere ogni oggetto nell'array.
  • ๐Ÿ“ Dimensione fissa: Un array non puรฒ espandersi dopo l'allocazione. Utilizzare ArrayList quando il numero di oggetti cambia in fase di esecuzione.
  • ???? ๏ธ Inizializzazione del costruttore: I costruttori passati inline durante la creazione offrono una configurazione piรน breve e sicura rispetto alle chiamate setter post-hoc.
  • ๐Ÿšš Parametro del metodo: Passare l'array a un metodo trasferisce un riferimento, quindi le modifiche all'interno del metodo sono visibili a chi lo chiama.

Serie di oggetti in Java

Che cos'รจ un array di oggetti in Java?

A Java serie di oggetti memorizza piรน istanze di oggetti della stessa classe in un singolo contenitore di dimensioni fisse. A differenza di un array primitivo che memorizza valori come int, double, o boolean direttamente in ogni slot, una serie di oggetti memorizza Riferimenti. Ogni slot punta alla posizione di memoria di un oggetto e l'oggetto stesso risiede su Java mucchio.

Questo layout corrisponde al modo in cui qualsiasi oggetto variabile in Java Funziona. L'array raggruppa semplicemente diversi riferimenti a oggetti in modo da poterli accedere tramite indice. รˆ la scelta naturale quando il numero di oggetti รจ noto in anticipo e non cambia durante il ciclo di vita del programma.

Sintassi

ClassName[] obj = new ClassName[array_length];

Il lato destro assegna spazio per array_length riferimenti, tutti inizializzati a null. Nessun oggetto di ClassName esiste ancora, solo il contenitore che puรฒ contenere riferimenti a tali oggetti.

Come creare un array di oggetti in Java

La creazione di un array di oggetti funzionante richiede sempre due fasi di allocazione. La prima alloca il contenitore di riferimento e la seconda alloca ciascun oggetto a cui il contenitore punterร .ping Il secondo passo รจ la fonte piรน comune di NullPointerException in principiante Java codice.

Passo 1) Apri il tuo editor di codice e copia il seguente codice:

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

Passo 2) Salvare il file come ObjectArray.java, quindi compilalo ed eseguilo.

Passo 3) Prendi nota dell'errore. Prova a risolverlo prima di procedere al passaggio 4.

Passo 4) Ispezionare la linea Account obj[] = new Account[2];. Alloca un array di due variabili di riferimento di tipo Accountma non assegna alcuno Account oggetti. Entrambi gli slot contengono nulle chiamando obj[0].setData(...) su una null il riferimento lancia un NullPointerException in fase di esecuzione.

Java Variabili di riferimento di array di oggetti

Passo 5) Rimuovi il commento dalle righe 4 e 5. Queste due righe creano un vero Account oggetti e assegnarli a obj[0] and obj[1]L'array ora contiene riferimenti reali e il codice viene eseguito correttamente.

Java Array di oggetti popolati

Produzione:

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

Come inizializzare un array di oggetti in Java

Oltre all'inizializzazione tramite metodi setter mostrata sopra, un array di oggetti puรฒ essere inizializzato in tre modi piรน eleganti. Ogni stile privilegia la chiarezza alla prolissitร , quindi scegli quello piรน adatto alla situazione.

  1. Inizializzazione del ciclo โ€” allocare l'array, quindi scorrere ogni indice e assegnare un nuovo oggetto. Questo รจ lo schema standard per array di grandi dimensioni o quando il numero di oggetti รจ dinamico.
  2. Inizializzazione del costruttore โ€” Passa i valori direttamente al costruttore al momento della creazione, quindi non รจ necessaria una chiamata separata al metodo setter.
  3. Inizializzazione di array letterali โ€” dichiarare e popolare in un'unica istruzione con un inline { ... } Inizializzatore, ideale per piccoli set fissi.
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);
    }
}

L'inizializzazione del ciclo รจ l'impostazione predefinita piรน sicura perchรฉ garantisce che non venga lasciato alcuno slot nullL'inizializzazione tramite costruttore rende esplicito l'intento quando ogni oggetto necessita di argomenti diversi, e i letterali di array mantengono compatto il codice di esempio. Non mescolare stili all'interno dello stesso array a meno che non ci sia un motivo: la coerenza rende piรน facile individuare i bug.

Iterazione e accesso agli elementi in un Java Matrice di oggetti

Una volta popolato un array di oggetti, tre modelli coprono quasi tutte le esigenze di accesso. Scegli lo stile di ciclo che meglio si adatta al livello di controllo di cui il codice ha bisogno sull'indice.

Classici - Classic for loop Consente l'accesso all'indice, utile per sostituire elementi, confrontare elementi adiacenti o iterare un sottointervallo.

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

Migliorata for loop (il ciclo โ€œfor-eachโ€) nasconde lโ€™indice e rende la lettura piรน naturale quando lโ€™indice non รจ necessario:

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

Flussi (Java 8 e successivi) convertire l'array in una pipeline, utile per filtrare, mappareping, oppure aggregando senza scrivere un ciclo:

import java.util.Arrays;

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

Per leggere o aggiornare un singolo elemento, utilizzare l'accesso diretto all'indice, ad esempio obj[1].setData(10, 20). Controlla sempre prima la lunghezza con obj.length per evitare ArrayIndexOutOfBoundsException. Quando qualsiasi slot potrebbe essere null, proteggere l'accesso con un controllo nullo o un Optional per mantenere il programma in esecuzione anzichรฉ bloccarsi.

Array di oggetti vs ArrayList di oggetti in Java

Un array di oggetti semplice รจ veloce e prevedibile, ma la sua dimensione fissa diventa un limite non appena il numero di oggetti cambia durante l'esecuzione. Java'S Quadro delle raccolte fornisce ArrayList come alternativa dinamica. La tabella seguente evidenzia quando ciascuna scelta รจ appropriata.

CaratteristicaMatrice di oggettiArrayList di oggetti
TagliaFissato in fase di creazioneSi espande e si riduce automaticamente
DichiarazioneAccount[] a = new Account[5];List<Account> list = new ArrayList<>();
Elemento di accessoa[i]list.get(i)
Aggiungi elementoNon supportato dopo la creazionelist.add(obj)
Digitare sicurezzaTipo in fase di compilazione tramite dichiarazioneI generici vengono imposti in fase di compilazione
Cookie di prestazioneLetture indicizzate leggermente piรน velociSomma ammortizzata O(1), un po' di overhead per elemento
Preferito quandoLa dimensione รจ nota e fissaLe dimensioni sono sconosciute o cambiano durante l'esecuzione.

Utilizza un array quando un ingombro di memoria ridotto e un'indicizzazione prevedibile sono importanti, ad esempio nei layout a matrice o nei percorsi critici per le prestazioni. Utilizza ArrayList nella maggior parte del codice delle applicazioni di uso quotidiano, perchรฉ la possibilitร  di aggiungere e rimuovere senza riallocazione compensa il piccolo overhead per elemento.

DOMANDE FREQUENTI

Un array di oggetti in Java รจ un contenitore di dimensioni fisse che memorizza riferimenti a istanze della stessa classe. Ogni slot punta a un oggetto nell'heap e gli elementi vengono acceduti tramite indice a base zero utilizzando parentesi quadre.

Dichiara l'array con ClassName[] arr = new ClassName[size], quindi crea ogni oggetto con new ClassName() in un ciclo o con un array letterale inline. Entrambi i passaggi sono necessari; il primo alloca solo slot di riferimento.

Poichรฉ `new ClassName[size]` alloca solo l'array stesso, ogni slot inizia come null, quindi la chiamata di qualsiasi metodo su quello slot genera una `NullPointerException`. Risolvi il problema assegnando un `new ClassName()` a ciascun indice prima dell'uso.

Un array ha una dimensione fissa scelta al momento della creazione, mentre ArrayList si espande e si riduce automaticamente. Gli array offrono letture indicizzate leggermente piรน veloci; ArrayList aggiunge comodi metodi di aggiunta, rimozione e streaming per il codice applicativo di uso quotidiano.

Utilizza un classico ciclo for con arr.length quando ti serve l'indice, oppure un ciclo for-each avanzato per una semplice iterazione. Per filtrare o trasformare l'array, racchiudilo in Arrays.stream(arr) e concatena la pipeline necessaria.

Dichiara il parametro come ClassName[] name, quindi chiama il metodo con la variabile array. Java Il riferimento all'array viene passato per valore, pertanto le modifiche ai campi degli elementi all'interno del metodo sono visibili al chiamante.

I generatori di codice per l'apprendimento automatico riconoscono lo schema di allocazione in due fasi e completano le righe mancanti `new ClassName()` che i principianti tendono a dimenticare. Inoltre, suggeriscono `ArrayList` quando la dimensione della collezione di destinazione รจ sconosciuta, riducendo i bug di tipo `NullPointerException`.

Sรฌ. GitHub Copilot genera dichiarazioni di array, cicli di costruzione, blocchi di iterazione e conversioni di ArrayList a partire da un commento che descrive il modello di dominio. RevIew ha generato il codice per verificare la correttezza degli argomenti del costruttore e la gestione sicura dei valori null prima dell'utilizzo.

Riassumi questo post con: