Respuestas:
El Scala List
es una estructura de datos recursiva inmutable que es una estructura tan fundamental en Scala, que (probablemente) debería usarla mucho más que un Array
(que en realidad es mutable , el análogo inmutable de Array
es IndexedSeq
).
Si viene de un fondo Java, entonces el paralelo obvio es cuándo usar LinkedList
más ArrayList
. El primero se usa generalmente para listas que solo se recorren (y cuyo tamaño no se conoce por adelantado), mientras que el segundo se debe usar para listas que tienen un tamaño conocido (o tamaño máximo) o para las cuales es importante el acceso aleatorio rápido .
ListBuffer
proporciona una conversión de tiempo constante a una List
razón por la cual se debe usar solo ListBuffer
si se requiere dicha conversión posterior.
Una Array
matriz Java debe implementar una escala en la JVM y, por lo tanto, una Array[Int]
puede ser mucho más eficaz (como un int[]
) que una List[Int]
(que encapsulará su contenido, a menos que esté utilizando las últimas versiones de Scala que tienen la nueva @specialized
característica) .
Sin embargo, creo que el uso de Array
s en Scala debe mantenerse al mínimo porque parece que realmente necesita saber qué sucede debajo del capó para decidir si su matriz realmente estará respaldada por el tipo primitivo requerido, o puede ser en caja como un tipo de envoltura.
Además de las respuestas publicadas ya, aquí hay algunos detalles.
Mientras que an Array[A]
es literalmente una matriz de Java, a List[A]
es una estructura de datos inmutable que es Nil
(la lista vacía) o consiste en un par (A, List[A])
.
Diferencias de rendimiento
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)
Diferencias de 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)
Entonces, a menos que necesite acceso aleatorio rápido, necesite contar elementos, o por alguna razón necesite actualizaciones destructivas, a List
es mejor que an Array
.
list = list.drop(i)
. O, ¿ocurre algo de magia detrás del capó?
drop
nunca necesitan copiar la parte de la lista que no se descartó. Por ejemplo, (x::xs).drop(1)
es exactamente xs
, no una "copia" de xs
.
Una matriz es mutable, lo que significa que puede cambiar los valores de cada índice, mientras que una lista (por defecto) es inmutable, lo que significa que se crea una nueva lista cada vez que realiza una modificación. En la mayoría de los casos se trata de un estilo más "funcional" para trabajar con tipos de datos inmutables y probablemente debería tratar de utilizar una lista con construcciones como yield
, foreach
, match
y así sucesivamente.
Para las características de rendimiento, una matriz es más rápida con acceso aleatorio a los elementos, mientras que una lista es más rápida al anteponer (agregar) nuevos elementos. Iterar sobre ellos es comparable.
iterate over
, debido a la caché