Structures immuables
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.
Structures mutables
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, aList[A]
est une structure de données immuable qui est soitNil
(la liste vide), soit constituée d'une paire(A, List[A])
.Différences de performances
Différences de mémoire
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'unArray
.la source
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 exactementxs
, pas une "copie" dexs
.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.
la source
iterate over
, à cause du cache