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.