Dichiarazione e creazione di array

Un array di lunghezza n è una collezione di n variabili dello stesso tipo, distinguibili l'una dall'altra per mezzo di un indice, cioè di un numero intero progressivo che può assumere valori tra 0 e n-1. Come si crea un array? Esempio:
 
int [] list = new int[5];


// equivalentemente
int[] list;
list = new int[5];

Dichiara list come variabile di tipo "array di int" e gli assegna un nuovo array di 5 elementi.

In generale, una dichiarazione di variabile di tipo array con inizializzazione ha la seguente forma:
 

<tipo>[] <nomeArray> = new <tipo>[<lunghezza>];

dove 

  • <tipo> è chiamato il tipo base dell'array, e può essere un qualunque tipo di dato Java (un tipo elementare o una classe)
  • <nomeArray> è la variabile di tipo array
  • <lunghezza> è la lunghezza dell'array che si costruisce 



  Gli array sono oggetti

Gli array sono realizzati in Java come oggetti di una classe opportuna (che viene dichiarata dinamicamente): questo si vede anche dall'uso della primitiva new per la creazione. 

Una dichiarazione di array consiste di due fasi: creazione del riferimento e allocazione dello spazio necessario a memorizzare gli elementi. 
 
int[] list;

list = new int[5];
 

// crea un riferimento vuoto (null)

// crea un array di 5 interi 
// e setta list a riferirlo


Quindi una variabile di tipo array è solo un riferimento o puntatore all'area di memoria dove viene allocato l'array. L'operatore  new crea l'insieme di variabili che costituiscono l'array e la variabile length, e l'assegnamento le collega alla variabile di tipo array.

Nel momento in cui viene creato l'array, tutti i valori sono inizializzati a 0 (per un array di numeri, come int[] o double[]), false (per un array boolean[]) o null (per un array di oggetti).
 




Accesso a elementi di un array


Per riferirsi ai singoli elementi di un array si usano le parentesi quadre:
 
<nomeArray>[<indice>] // denota la variabile di posizione
                      // <indice> dell'array <nomeArray>

Attenzione:
il primo elemento di un array di lunghezza n ha indice 0, il secondo ha indice 1, e così via, fino all'ultimo elemento, che ha indice n-1.

Ad esempio, per inserire il valore 10 nel quarto elemento dell'array list, cioè in list[3], si deve usare il comando:

list[3] = 10;

Per leggere il valore dell'elemento di indice 3 dell'array list, basta usare l'espressione list[3] come per qualsiasi variabile di tipo int; ad esempio si può stampare il valore contenuto in list[3] con il seguente comando:
 

System.out.println("L'elemento di indice 3 vale " + list[3]);



Inizializzazione di un array

Le singole variabili di un array possono essere inizializzate in fase di dichiarazione (in modo analogo alle variabili di tipi primitivi). In questo caso la dichiarazione di array ha la seguente forma:
 
  <tipo>[] <nomeArray> = {<valori>};

dove <valori> è una sequenza di elementi di tipo <tipo> separati da virgole.

Gli array hanno una variabile di istanza length, che contiene il numero degli elementi contenuti.

Esempio:
 

 char[] vocali = {'a', 'e', 'i', 'o', 'u'};
 char c = vocali[4];
 System.out.println(c);
 System.out.println(vocali.length); 
// stampa u
// stampa 5

Si noti che length non è seguita da parentesi: si tratta infatti di una variabile istanza dell'oggetto array, non di un metodo (come nel caso delle stringhe).




Proprietà degli array

  • La dimensione di un array è fissata al momento della creazione e non può essere cambiata (ma vedremo la classe Vector)
  • Un array può comparire come parametro formale di un metodo. In questo caso non è necessario specificarne la lunghezza: il metodo accetterà array di tipo appropriato di qualsiasi lunghezza.
Esempio tipico:

   main (String[] args)

dove args è un array di argomenti di lunghezzaargs.length.
La seguente istruzione stampa tutti gli elementi dell'array args:
 
 

for (int i = 0; i <= args.length; i++)
      System.out.println(args[i]);

 




Copiare gli array

Le variabili array funzionano esattamente come le variabili oggetto: contengono un riferimento all'array in questione. Se si copia il riferimento, si ottiene un altro riferimento allo stesso array, e NON una copia dell'intero array.

Volendo fare una copia esatta di un array, bisogna creare un nuovo array della stessa lunghezza di quello originale e copiare tutti i valori usando un ciclo.

Esempio:

a seguente istruzione stampa tutti gli elementi dell'array args:
 
 

   int[] list = new int[5];

   ...    // riempimento dell'array list

   int[] elenco = new int[list.length];
   for (int i=0; i < list.length; i++)
        elenco[i]=list[i];
 


 

 




Nota Storica

Come abbiamo visto, in Java una dichiarazione di variabile di tipo array ha la forma
 
<tipo>[] <nomeArray>;

Infatti, come sempre, in una dichiarazione di variabile il tipo precede il nome della variabile stessa. Tuttavia, per motivi storici, questa dichiarazione può anche essere scritta
 

<tipo> <nomeArray>[];


//ad esempio:
int list[] = new int[5];

che è la sintassi usata nei linguaggi C and C++, anche se questa non è molto significativa in Java (e dovrebbe essere evitata!). Analogamente,
 

public static void main(String[] args){


// può essere scritto:
public static void main(String args[]){