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 Arrayis IndexedSeq).
Se si proviene da un background di Java, quindi l'ovvio parallelo è quando usare LinkedListsopra 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 .
ListBufferfornisce una conversione a tempo costante in un Listmotivo che è la sola ragione da utilizzare ListBufferse è richiesta tale conversione successiva.
Uno scala Arraydovrebbe 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 @specializedfunzionalità) .
Tuttavia, penso che l'uso di Arrays 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?
dropnon è mai necessario copiare la parte dell'elenco che non è stata eliminata. Ad esempio , non (x::xs).drop(1)è esattamente xsuna "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, matche 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