Eh bien, un List
peut être incroyablement rapide si l'algorithme peut être mis en œuvre uniquement avec ::
, head
y tail
. J'ai eu une leçon d'objet de cela très récemment, quand j'ai battu le Java's split
en générant un List
au lieu d'un Array
et je ne pouvais pas le battre avec autre chose.
Cependant, List
a un problème fondamental : il ne fonctionne pas avec les algorithmes parallèles. Je ne peux pas diviser un List
en plusieurs segments, ou le concaténer à nouveau, de manière efficace.
Il existe d'autres types de collections qui peuvent gérer le parallélisme bien mieux -- et Vector
est l'un d'entre eux. Vector
a également une grande localité, ce qui List
ne le fait pas - ce qui peut être un vrai plus pour certains algorithmes.
Donc, tout bien considéré, Vector
est le meilleur choix sauf si vous avez des considérations spécifiques qui rendent l'une des autres collections préférable -- par exemple, vous pouvez choisir Stream
si vous souhaitez une évaluation paresseuse et une mise en cache ( Iterator
est plus rapide mais n'a pas de cache), ou bien List
si l'algorithme est naturellement implémenté avec les opérations que j'ai mentionnées.
D'ailleurs, il est préférable d'utiliser Seq
o IndexedSeq
sauf si vous voulez un élément spécifique de l'API (tel que List
's ::
), ou encore GenSeq
o GenIndexedSeq
si votre algorithme peut être exécuté en parallèle.