Dans quels cas je devrais utiliser Array (Buffer) et List (Buffer). La seule différence que je connaisse est que les tableaux sont non-variables et les listes sont covariantes. Mais qu'en est-il de la performance et de certaines autres caractéristiques?
Le Scala List
est une structure de données récursive immuable qui est une structure tellement fondamentale dans Scala que vous devriez (probablement) l'utiliser beaucoup plus que Array
(qui est en réalité mutable - l'analogue immuable de Array
est IndexedSeq
) .
Si vous venez d'un arrière-plan Java, le parallèle évident est de savoir quand utiliser LinkedList
sur ArrayList
. Le premier est généralement utilisé pour les listes qui ne sont que jamais parcouru (et dont la taille n’est pas connue à l’avance) alors que cette dernière doit être utilisée pour les listes qui ont soit une taille connue (ou une taille maximale), soit lequel l'accès aléatoire rapide est important.
ListBuffer
fournit une conversion en un temps constant en un List
qui est la seule raison d'utiliser ListBuffer
si une conversion ultérieure est requise.
Un scala Array
devrait être implémenté sur la machine virtuelle Java par un tableau Java, et donc un Array[Int]
peut être beaucoup plus performant (comme un int[]
) qu'un List[Int]
_ (qui encapsulera son contenu, sauf si vous utilisez les toutes dernières versions de Scala qui ont le nouveau @specialized
fonctionnalité).
Cependant, je pense que l’utilisation de Array
s dans Scala devrait être réduite au minimum, car il faut vraiment 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 mis en boîte comme un type wrapper.
En plus des réponses déjà affichées, voici quelques détails.
Alors qu'un Array[A]
Est littéralement un Java, un List[A]
Est une structure de données immuable qui est soit Nil
(la liste vide), soit consiste en une paire (A, List[A])
.
Différences de performance
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)
Ainsi, à moins que vous ayez besoin d'un accès aléatoire rapide, de compter des éléments ou, pour une raison quelconque, de mises à jour destructives, un List
est préférable à un Array
.
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, travailler avec des types de données immuables est un style plus "fonctionnel" et vous devriez probablement essayer d’utiliser une liste avec des constructions telles que yield
, foreach
, match
, etc. en avant.
Pour les caractéristiques de performance, 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 (au début) de nouveaux éléments. Itérer sur eux est comparable.