Java/Array: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
m →‎Array o Collection?: superfluo, e poi nelle note è esteticamente meglio senza
m trasformo note in biblio, uso nuovo tmpl {{Java/Javadoc}}, fixes vari
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]</ref>
 
__TOC__
 
== Caratteristiche ==
Le caratteristiche degli array 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 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>{{Java/Javadoc|clone()</tt>.<ref group|javadoc="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 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 {{Java/Javadoc|java.lang.Cloneable|javadoc=java/lang/Cloneable.html}} e {{Java/Javadoc|java.io.Serializable|javadoc=java/io/Serializable.html}}.
<tt>java.lang.Cloneable</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/lang/Cloneable.html Documentazione dell'interfaccia <tt>java.lang.Cloneable</tt>]</ref> 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>;
Line 98 ⟶ 96:
 
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/Javadoc|java.lang.ArrayIndexOutOfBoundsException</tt><ref group|javadoc="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 156 ⟶ 154:
=== Conversione ===
; Da collezione ad array
Invocare sulla collezione uno dei due metodi {{Java/Javadoc|toArray()|javadoc=java/util/Collection.html}}.<br/>
<tt>toArray()</tt><ref group="D">[http://download.oracle.com/javase/6/docs/api/java/util/Collection.html Documentazione dell'interfaccia <tt>java.util.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
<tt>{{Java/Javadoc|java.util.Arrays.asList()</tt><ref group|javadoc="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 {{Java/Javadoc|java.util.List|javadoc=java/util/List.html}} di dimensioni costanti e che fornisca accesso in lettura e scrittura.
<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) è arbitraria e lasciata al programmatore.
Line 174 ⟶ 169:
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/Javadoc|java.util.ArrayList|javadoc=java/util/ArrayList.html}} esibisce buone prestazioni per la maggior parte delle applicazioni in cui sia necessario disporre di una lista ad accesso casuale, e la classe {{Java/Javadoc|java.util.LinkedList|javadoc=java/util/LinkedList.html}} è sicuramente più facile da usare di un array nel caso sia necessario uno [[w:it:stack|stack]] o una [[w:it:Coda (informatica)|coda]].
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="DA">Vedi anche: [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 201 ⟶ 192:
 
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 assumono inizialmente valori casuali o imprevedibili.
 
== Bibliografia ==
*[http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html Capitolo 10 delle specifiche di linguaggio], con particolare riferimento alla [http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.3 sezione 10.3], ''Array Creation'', e alla [http://java.sun.com/docs/books/jls/third_edition/html/arrays.html#10.7 sezione 10.7], ''Array Members''.
*[http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.13 Capitolo 15 delle specifiche di linguaggio, sezione 15.13] (''Array Access Expressions'')
 
== Note ==
Line 208 ⟶ 203:
; Approfondimenti
<references group="A"/>
 
; Documentazione
<references group="D"/>