Java/Array: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m link e note
Riga 1:
{{Java/Prima parte}}
 
Un array rappresenta una sequenza finita di elementi che hanno uno stesso tipo in comune. Il relativo capitolo, nella seconda edizione delle specifiche di linguaggio, è il capitolo 10.<ref group="A">[http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html capitolo 10].</ref>
 
__TOC__
 
== Caratteristiche ==
''SiLe vedacaratteristiche anchedegli laarray sono definite dalle specifiche di linguaggio.<ref group="A">[http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.7 Per maggiori informazioni, consultare la sezione 10.7] del capitolo 10 delle specifiche di linguaggio.'']</ref>
 
Un array è un [[Java/Oggetti|oggetto]] dotato di un numero fisso di ''celle'' (in inglese, ''slot''), il 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:
Riga 27:
:<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 group="A">Per maggiori 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>
 
; Clonazione
Gli array esibiscono un metodo pubblico <tt>clone()</tt>.<ref group="D">[http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#clone() Documentazione del metodo <tt>clone()]</tt>.]</ref>
 
== Creazione e distruzione ==
''Gli array sono creati tramite una sintassi specifica, definita dal linguaggio.<ref group="A">Si veda anche la [http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3 sezione 10.3] del capitolo 10 delle specifiche di linguaggio.'']</ref>
 
; Inizializzando le celle con il valore di default
Riga 78:
È sempre possibile convertire un 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,
*gli array supportano il metodo <codett>java.lang.Cloneable</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/lang/ObjectCloneable.html#clone() clone()Documentazione dell'interfaccia <tt>java.lang.Cloneable</tt>]</coderef>; e
<tt>java.io.Serializable</tt><ref group="D">Vedi anche la [http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html Documentazione dell'interfaccia <tt>java.io.Serializable</tt>]</ref>.
In particolare,
*gli array supportano il metodo <tt>clone()</tt>;
*è possibile serializzare gli array come qualunque altro oggetto:
<source lang="Java">
Line 94 ⟶ 97:
Non è permesso leggere o scrivere al di fuori della memoria che è stata allocata per un array. In altre parole, non è possibile accedere ad una cella che ha un indice inferiore all'indice minimo (che è sempre 0) o superiore all'indice massimo (che è sempre pari ad <code>array.length - 1</code>).
 
Se si tenta di compiere una operazione del genere, la macchina virtuale [[Java/Gestione delle eccezioni|lancerà una eccezione]] a ''run-time'', (in particolare una
<tt>java.lang.ArrayIndexOutOfBoundsException</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/lang/ArrayIndexOutOfBoundsException.html Documentazione della classe <tt>java.lang.ArrayIndexOutOfBoundsException</tt>])</ref>.
<source lang="Java">
int[] array = new int[3];
Line 141 ⟶ 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 152 ⟶ 156:
=== Conversione ===
; Da collezione ad array
Invocare sulla collezione uno dei due metodi <tt>[http://download.oracle.com/javase/6/docs/api/java/util/Collection.html toArray()]</tt>.<br/>
Invocare il metodo <tt>toArray()</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/ArraysCollection.html#asList(T...) Documentazione dell'interfaccia <tt>java.util.Arrays.asList()]Collection</tt>]</ref>.<br/>
'''''Nota''': questo metodo restituisce una '''copia''' degli elementi della collezione: se quest'ultima viene modificata in seguito, le modifiche non interesseranno anche l'array.''
 
; Da array a collezione
Invocare il metodo
Invocare il metodo <tt>[http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...) java.util.Arrays.asList()]</tt>.<br/>
<tt>java.util.Arrays.asList()</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList(T...) Documentazione del metodo <tt>asList()</tt>]</ref>.<br/>
'''''Nota''': questo metodo restituisce una List che opera '''sull'array''' passato come argomento: se quest'ultimo verrà modificato in seguito, le modifiche potrebbero ripercuotersi sulla List.''
 
=== Array o Collection? ===
Un array ha la stessa identica funzionalità di una
<tt>java.util.List</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/List.html Documentazione dell'interfaccia <tt>java.util.List</tt>] </ref>
di dimensioni costanti e che fornisca accesso in lettura e scrittura.
 
La scelta fra un tipo array e una List (o altra
Collection<ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/Collection.html Documentazione dell'interfaccia <tt>java.util.Collection</tt>]</ref>)
è arbitraria e lasciata al programmatore.
 
Se si sta progettando l'implementazione privata di una classe o il corpo di un metodo, non c'è motivo di porsi il problema, perché, in futuro, si potrà tornare indietro sulla decisione con modifiche che resteranno sempre circoscritte.
 
Negli altri casi, in genere, non vale la pena di scegliere un tipo array al posto di una collezione, se l'<nowiki/>''unica'' ragione è ottimizzare il codice che accede alle celle, cioè per usare l'accesso diretto alla memoria come "scorciatoia" che eviti le invocazioni dei metodi <code>get</code> e <code>set</code>. Infatti, le macchine virtuali odierne adottano delle tecniche di ottimizzazione (come l'<nowiki/>''inlining'' dei metodi di dimensioni ridotte) che rendono superfluo un accorgimento come questo. Inoltre, la classe
java.util.ArrayList<ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html Documentazione dell'interfaccia <tt>java.util.ArrayList</tt>] </ref>
esibisce buone prestazioni per la maggior parte delle applicazioni in cui sia necessario disporre di una lista ad accesso casuale, e la classe
java.util.LinkedList<ref group="D">[http://download.oracle.com/javase/7/docs/api/java/util/LinkedList.html Documentazione dell'interfaccia <tt>java.util.LinkedList</tt>] </ref>
è sicuramente più facile da usare di un array nel caso sia necessario uno [[w:it:stack|stack]] o una [[w:it:Coda (informatica)|coda]].
 
Nella scelta si deve tenere conto anche del fatto che lo strato di astrazione aggiuntivo permette ai client di fornire una implementazione personalizzata, e ciò rende la struttura a oggetti più resistente nei confronti delle eventuali modifiche future che potrà essere necessario implementare nel programma.<br/>
In certi casi, una collezione personalizzata permette di risparmiare memoria, in quanto non tutto il contenuto deve risiedere in memoria. Si pensi ad una lunga sequenza di elementi uguali tra loro: in alternativa, si può conservare una sola copia del valore, e simulare una collezione di grandi dimensioni manipolando gli indici.
<ref group="D">PerVedi maggiori informazioni, vedianche: [http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#nCopies(int,%20T) documentazione del metodo <tt>java.util.Collections.nCopies()</tt>]</ref>
Un'altra implementazione può accedere direttamente alle proprietà di un oggetto o ai campi di un database, mascherandolo dietro l'interfaccia della collezione, invece di utilizzare la memoria come passaggio intermedio (e obbligatorio) per la memorizzazione dei dati.<br/>
Inoltre, per manipolare il contenuto di un array, riordinandolo o trasformando i singoli elementi, è necessario portare il programma ad eseguire costose iterazioni, ed eventualmente duplicarne il contenuto in memoria finché la trasformazione non è completa. Una collezione che sia stata implementata come [[w:it:wrapper|wrapper]], al contrario, può svolgere queste operazioni "al volo" e solo sugli elementi per i quali è effettivamente richiesta a tempo di esecuzione, lasciando inalterata la collezione iniziale.
 
Line 192 ⟶ 208:
<references/>
 
; Approfondimenti
; Fonti
<references group="FA"/>
 
; Documentazione
<references group="D"/>