Réponses:
La Scala List
est une structure de données récursive immuable qui est une structure si fondamentale dans Scala, que vous devriez (probablement) l'utiliser beaucoup plus qu'un Array
(qui est en fait mutable - l' analogue immuable de Array
is IndexedSeq
).
Si vous venez d'un arrière-plan Java, le parallèle évident est de savoir quand utiliser LinkedList
over ArrayList
. Le premier est généralement utilisé pour les listes qui ne sont parcourues que jamais (et dont la taille n'est pas connue à l'avance) tandis que le second doit être utilisé pour les listes qui ont une taille connue (ou une taille maximale) ou pour lesquelles un accès aléatoire rapide est important.
ListBuffer
fournit une conversion à temps constant en un List
qui est la seule raison à utiliser ListBuffer
si une telle conversion ultérieure est requise.
Un scala Array
doit être implémenté sur la JVM par un tableau Java, et donc un Array[Int]
peut être beaucoup plus performant (en tant que int[]
) qu'un List[Int]
(qui encapsulera son contenu, sauf si vous utilisez les toutes dernières versions de Scala qui ont la nouvelle @specialized
fonctionnalité) .
Cependant, je pense que l'utilisation de Array
s dans Scala devrait être réduite au minimum car il semble que vous ayez vraiment besoin de savoir ce qui se passe sous le capot pour décider si votre tableau sera vraiment soutenu par le type primitif requis, ou peut être emballé comme un type d'emballage.
En plus des réponses déjà publiées, voici quelques détails.
Alors que an Array[A]
est littéralement un tableau Java, a List[A]
est une structure de données immuable qui est soit Nil
(la liste vide), soit constituée d'une paire (A, List[A])
.
Différences de performances
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)
Différences de mémoire
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)
Donc, à moins que vous n'ayez besoin d'un accès aléatoire rapide, que vous ayez besoin de compter des éléments ou que, pour une raison quelconque, vous ayez besoin de mises à jour destructrices, un List
est mieux qu'un Array
.
list = list.drop(i)
. Ou, se produit-il de la magie derrière le capot?
drop
ne doivent jamais copier la partie de la liste qui n'a pas été supprimée. Par exemple, (x::xs).drop(1)
est exactement xs
, pas une "copie" de xs
.
Un tableau est modifiable, ce qui signifie que vous pouvez modifier les valeurs de chaque index, tandis qu'une liste (par défaut) est immuable, ce qui signifie qu'une nouvelle liste est créée à chaque fois que vous effectuez une modification. Dans la plupart des cas , il est un style plus « fonctionnel » à travailler avec des types de données immuables et vous devriez probablement essayer d'utiliser une liste avec des constructions comme yield
, foreach
, match
et ainsi de suite.
Pour les caractéristiques de performances, un tableau est plus rapide avec un accès aléatoire aux éléments, tandis qu'une liste est plus rapide lors de l'ajout de nouveaux éléments. Les itérer est comparable.
iterate over
, à cause du cache