Dichiarazione, creazione e inizializzazione di array
Gli array sono oggetti. Le variabili array sono solo riferimenti agli array.
Per usare un array bisogna prima dichiararlo e poi crearlo con l’operatore new
. Poi bisogna inserirvi i dati.
tipo[] nomeArray; nomeArray = new tipo[dimensione];
Il tipo degli elementi può essere uno qualsiasi dei tipi utilizzabili in Java.
int[] numeri; numeri = new int[100];
array di interi di 100 elementi.
Nella dichiarazione le parentesi quadre si possono scrivere dopo il tipo o dopo il nome (cioè tipo[] nomeArray
o tipo nomeArray[]
); metterle dopo il tipo è meglio perché la dichiarazione di tipo risulta raccolta tutta in un punto.
Le due fasi di dichiarazione e creazione possono essere eseguite nella stessa istruzione.
tipo[] nomeArray = new tipo[dimensione]
int[] numeri = new int[100];
Se si dichiara soltanto l’array senza crearlo e poi si cerca di utilizzarlo (cioè si usa l’operatore []
su un riferimento con valore null
) viene lanciata l’eccezione NullPointerException
.
Quando si crea un array tutti gli elementi sono inizializzati a zero per un array di numeri, a spazi per un array di char
e a false
per un array di boolean
.
Si possono inizializzare i valori dell’array al momento della dichiarazione inserendo i valori tra parentesi graffe; in questo caso l’array viene creato con un new
implicito.
int[] multipliDiTre = {3, 6, 9, 12, 15, 18, 21, 24, 27, 30};
Per accedere ad un elemento dell’array si usa la notazione:
nomeArray[indice]
L’indice può essere una costante, una variabile o una espressione che una volta calcolata assume un valore di tipo int compreso tra 0 e la dimensione dell’array meno uno; se l’indice è esterno all’intervallo di definizione viene lanciata l’eccezione IndexOutOfBoundsException
.
Per l’array numeri
int[] numeri = new int[100];
l’indice deve essere un numero tra 0 e 99 (compresi).
numeri[0]= 3;
Gli array sono memorizzati in locazioni contigue di memoria.
Classe Mesi
con un array con i nomi dei mesi e un array con il numero di giorni dei mesi e metodi per accedere ai dati.
Dimensione
Gli array hanno una variabile istanza length
che dà la dimensione dell’array.
for (int i = 0; i<numeri.length; i++) {...}
La parola length
non è seguita da parentesi: è una variabile, non un metodo; è una anomalia perché di solito si usa un metodo per accedere agli attributi di un oggetto; la lunghezza dell’array comunque non può essere modificata perché la variabile length
è dichiarata final
.
Una volta impostata, la dimensione dell’array non può essere cambiata.
Quando si inseriscono degli elementi bisogna controllare di non superare la dimensione dell’array.
Se si devono inserire altri elementi e l’array è pieno si può creare un array più grande e copiarvi tutti i dati.
Copia di array
Assegnando una variabile array ad un’altra si copia il riferimento all’array e non il suo contenuto (cioè le due variabili si riferiscono allo stesso array).
Per copiare un array bisogna creare un nuovo array della stessa lunghezza e copiare tutti gli elementi con un ciclo.
int[] numeri2 = new int[numeri.length]; for (int i = 0; i<numeri.length; i++) { numeri2[i] = numeri[i]; }
In alternativa si può usare il metodo statico arraycopy()
della classe System
.
System.arraycopy(numeri, 0, numeri2, 0, numeri.length);
Si può anche usare il metodo clone()
(ereditato da Object
).
numeri2 = numeri.clone();
Foreach
L’istruzione for
generalizzata (enhanced for), chiamata di solito foreach
, permette di eseguire automaticamente un ciclo sugli elementi dell’array.
for (tipo nomeVariabile : nomeArray) { //istruzioni }
int[] numeri = {10,20,30,40,50,60,70,80,90,100}; for (int valore : numeri) { System.out.println(valore); }
Array come parametri di metodi e valori restituiti
Si può passare un array come parametro a un metodo; il passaggio avviene per valore ma quello che viene passato è il riferimento all’array; quindi nel metodo è possibile modificare l’array passato.
Se si deve creare un array solo per passarlo come parametro a un metodo si può costruire un array anonimo con
new tipo[] {...valori ...}
oggetto.metodo(new int[] {2,3,5,7,9})
Un metodo può restituire come valore di ritorno un array; restituire un array è utile se si deve restituire un gruppo di valori dello steso tipo.
Classe Array
che ha come attributo un array di numeri e fornisce un metodo per creare un array somma di questo array e di un array di dimensione qualsiasi (somma solo gli elementi comuni e restituisce un array di questa dimensione.