Risposte:
Scala List
è un'immutabile struttura di dati ricorsivi che è una struttura così fondamentale in Scala, che dovresti (probabilmente) usarla molto più di un Array
(che è in realtà mutabile - l' analogo immutabile di Array
is IndexedSeq
).
Se si proviene da un background di Java, quindi l'ovvio parallelo è quando usare LinkedList
sopra ArrayList
. Il primo viene generalmente utilizzato per elenchi che vengono attraversati sempre e solo (e la cui dimensione non è nota in anticipo) mentre il secondo deve essere utilizzato per elenchi che hanno una dimensione nota (o dimensione massima) o per i quali è importante un accesso casuale rapido .
ListBuffer
fornisce una conversione a tempo costante in un List
motivo che è la sola ragione da utilizzare ListBuffer
se è richiesta tale conversione successiva.
Uno scala Array
dovrebbe essere implementato sulla JVM da un array Java, e quindi un Array[Int]
potrebbe essere molto più performante (come un int[]
) di un List[Int]
(che impacchetterà il suo contenuto, a meno che tu non stia usando le ultime versioni di Scala che hanno la nuova @specialized
funzionalità) .
Tuttavia, penso che l'uso di Array
s in Scala dovrebbe essere ridotto al minimo perché sembra che tu debba davvero sapere cosa sta succedendo sotto il cofano per decidere se il tuo array sarà davvero supportato dal tipo primitivo richiesto, o potrebbe essere inscatolato come un tipo di wrapper.
Oltre alle risposte già pubblicate, ecco alcuni dettagli.
Mentre an Array[A]
è letteralmente un array Java, a List[A]
è una struttura di dati immutabile che è Nil
(l'elenco vuoto) o è costituito da una coppia (A, List[A])
.
Differenze di prestazione
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
Differenze di memoria
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Pertanto, a meno che non sia necessario un rapido accesso casuale, sia necessario contare gli elementi o, per qualche motivo, siano necessari aggiornamenti distruttivi, a List
è meglio di un Array
.
list = list.drop(i)
. Oppure, si verifica un po 'di magia dietro il cofano?
drop
non è mai necessario copiare la parte dell'elenco che non è stata eliminata. Ad esempio , non (x::xs).drop(1)
è esattamente xs
una "copia" di xs
.
Un array è mutabile, il che significa che è possibile modificare i valori di ciascun indice, mentre un elenco (per impostazione predefinita) è immutabile, il che significa che un nuovo elenco viene creato ogni volta che si esegue una modifica. Nella maggior parte dei casi si tratta di uno stile più "funzionale" di lavorare con tipi di dati immutabili e, probabilmente, si dovrebbe cercare di utilizzare una lista con i costrutti come yield
, foreach
, match
e così via.
Per le caratteristiche prestazionali, un array è più veloce con accesso casuale agli elementi, mentre un elenco è più veloce quando si antepone (aggiungendo) nuovi elementi. Iterare su di essi è paragonabile.
iterate over
, a causa della cache