web-dev-qa-db-fra.com

Différence entre Array et List in scala

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?

126
Jeriho

Structures Immuables

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.

Structures mutables

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 Arrays 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.

144
oxbow_lakes

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.

126
Apocalisp

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.

17
leonm