Java/Array: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
m raggruppo note, edit minori
Riga 6:
 
== Caratteristiche ==
Un array è un [[Java/Oggetti|oggetto]] dotato di un numero fisso di ''celle'' (in inglese, ''slot''), il cui tipo delle quali è chiamato ''component type'' dell'array. Esse si comportano esattamente come se fossero dei campi non <tt>final</tt>, con le seguenti differenze:
*invece che da un nome alfanumerico, ogni cella è identificata da un numero intero positivo, chiamato "indice";
*invece del punto, per indicare una cella si usa [[#Membri di un array|una notazione diversa]].
Il numero esatto di celle viene specificato nella creazione dell'array, e [[#Membri di un array|non può essere cambiato]].
 
Il tipo delle celle, ovvero il ''component type'', può essere un tipo primitivo o un tipo riferimento. Invece, ilUn tipo dell'array è sempre un tipo riferimento, e si indica apponendo una coppia di parentesi quadre al ''component type''. Esempi:
*<tt>int[]</tt> indica il tipo <tt>array di int</tt>
*<tt>Object[]</tt> indica il tipo <tt>array di Object</tt>
Riga 19:
 
== Creazione e distruzione ==
Esistono''Si dueveda modianche perla creare un array.<ref>{{cita libro|url=[http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#25650|titolo=The10.3 Javasezione Language10.3] Specification|accesso=8del settembrecapitolo 2011}}</ref>10 delle specifiche di linguaggio.''
 
; Inizializzando le celle con il valore di default
Riga 28:
Tutte le celle sono automaticamente [[Java/Oggetti#Inizializzazione dei campi|inizializzate]] con il valore di default del ''component type''. Nell'esempio appena mostrato, tutti gli ''slot'' dell'array referenziato dalla variabile <tt>i</tt> valgono inizialmente <tt>0</tt>.
 
Ad esempio, l'istruzionela scrittura <code>new byte[1024]</code> crea un array di 1024 ''slot''celle, inizializzatiinizializzate al valore 0; oppure <code>new Object[1024]</code> crea un array di 1024 celle, inizializzate con il valore ''null''.
 
; Elencando gli elementi
È disponibile ununa costruttosintassi alternativoalternativa che permette di indicare direttamente i valori delle singole celle:
<source lang="Java">
int[] numeri = new int[] { -1, 0, 0 };
Riga 60:
 
== Tipi array ==
I tipi array sono tipi riferimento.
 
=== Gerarchia delle classi ===
È sempre possibile convertire un tipo array verso il tipo <tt>Object</tt> tramite cast implicito, in quanto tutti gli array sono oggetti.
 
In aggiunta, tutti gli array possono essere convertiti verso i tipi [http://download.oracle.com/javase/6/docs/api/java/lang/Cloneable.html java.lang.Cloneable] e [http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html java.io.Serializable]. In particolare,
Line 74 ⟶ 73:
 
=== Gerarchia fra tipi array ===
Il tipo di un array creato con <tt>new T[...]</tt> è <tt>T[]</tt>. L'arraySe può<tt>S</tt> essereè convertitoun versosupertipo qualunque tipodi <codett>S[]T</tt>, doveallora ogni array di tipo <tt>ST[]</tt> èpuò unessere supertipoconvertito diverso il tipo <ttcode>TS[]</tt> tramite cast implicito; la conversione inversa richiede il cast esplicito.
 
Questo significa che tutti gli array di oggetti possono essere convertiti verso <code>Object[]</code>.
Line 88 ⟶ 87:
:<tt>i[0] = 5;</tt> assegna il valore intero <tt>5</tt> alla prima cella dell'array.
 
Più precisamente, l'accesso a una cella, in lettura o in scrittura, si identifica apponendo una coppia di parentesi quadre ad un'espressione il cui ''compile-time type'' sia un tipo array, e inserendo fra queste parentesi un'espressione il cui ''compile-time type'' sia convertibile verso il tipo <tt>int</tt> tramite [[Java/Tipi di dati#Conversioni|cast implicito]].<ref>VediPer anchemaggiori informazioni, vedi {{cita libro|titolo=The Java Language Specification (Runtime Evaluation of Array Access)|url=http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#39346|accesso=8 settembre 2011}}</ref>
 
; Lunghezza
Line 146 ⟶ 145:
ovvero scorre l'array, dall'indice 0 all'indice <code>array.length - 1</code>, assegnando automaticamente il valore <code>array[i]</code> alla variabile <code>slot</code>, e ad ogni ciclo esegue l'istruzione <code>System.out.println(slot)</code>.
 
È chiamato ''for each'' o ''enhanced for'' ed è un costrutto introdotto dalla versione 1.5 di Java<ref group="F">Terza edizione della Java Language Specification.</ref>, che risparmia al programmatore il calcolo a mente degli indici se questi non sono realmente necessari (calcolo che viene svolto in automatico dal compilatore). Lo svantaggio è che non si può usare sempre, ad esempio nei seguenti casi:
*se bisogna accedere alle celle dell'array in scrittura;
*se è necessario accedere a più di una cella alla volta.
Line 181 ⟶ 180:
 
In C++, una variabile array è un puntatore costante, il quale, a run-time, punta ad un'area di memoria dei dati del programma, configurata dal compilatore. [[w:en:C_(programming_language)#Memory_management|Questa zona di memoria]] può essere a livello di programma (nel caso di una variabile globale o statica), oppure si trova nel ''call stack'' (nel caso di una variabile locale). <br/>
In Java, i tipi array sono tipi riferimento, quindi una variabile di tipo array contienereferenzia un oggetto che viene allocato sempre e solo sullo ''heap''.
 
L'allocazione statica e quella automatica richiedono che, a tempo di compilazione, sia nota la quantità massima di memoria che l'array occuperà a run-time. Il compilatore del C++ ha bisogno di conoscere non solo il tipo, ma anche il numero delle celle, che infatti va indicato obbligatoriamente nell'istruzione che ''dichiara'' l'array. Quest'ultimo può essere utilizzato subito dopo l'istruzione che lo dichiara., mentre in Java bisogna allocarlo dinamicamente, e quindi è necessario istanziarlo esplicitamente sullo ''heapallocarlo'' esplicitamente.
 
Oltre agli array, anche i puntatori del C++ supportano l'operatore "parentesi quadre", e l'allocazione dinamica di un array tramite <tt>new</tt> restituisce appunto un puntatore. Tuttavia, esso andrà memorizzato in una variabile di tipo puntatore, e non in una variabile array, perché quest'ultima è un puntatore ''costante''. In effetti, in C++, la sintassi degli array "maschera" le operazioni di accesso e manipolazione svolte sudi puntatori (aritmetica, dereferenziazione).
 
Poiché il C++ non è dotato di garbage-collector, èun necessarioarray deallocareallocato l'arraydinamicamente va deallocato dopo averloessere stato utilizzato (tramite unl'istruzione che permette di fare questo è <tt>delete[]</tt>, ed eventualmente iterandopuò essere necessario iterare lungo l'array per deallocarne a loro volta i singoli elementi). Il Java ha garbage-collector, quindi gli array non vanno deallocati esplicitamente.
 
Per massimizzare le prestazioni del codice eseguibile, in C++ è consentito accedere ad un array servendosi di un indice che sia fuori dai limiti. Di fatto, questa operazione risultaconsiste nell'accesso (in lettura o in scrittura) ad una cella di memoria non allocata. L'ambiente di esecuzione non segnalaè tenuto a segnalare questa situazione che è evidentemente non voluta dal programmatore. In Java, la VM lancia una eccezione se si tenta di accedere ad una cella che è fuori dai limiti dell'array.
 
Infine, le regole del Java impongono che le celle risultino ''sempre'' inizializzate prima che sia possibile accedervi. In C++ non è così, in quanto le celle hannoassumono inizialmente valori casuali o imprevedibili.
 
== Note ==
; Note esplicative
<references/>
 
; Fonti
<references group="F"/>