Je peux penser à 3 questions plus spécifiques pour répondre aux vôtres :
- Quelle est la collection par défaut de Scala ?
- Quelle collection Scala a des caractéristiques similaires à
ArrayList
?
- Quel est un bon remplacement pour
Array
en Scala ?
Voici donc les réponses à ces questions :
Quelle est la collection par défaut de Scala ?
L'équivalent en Scala de l'équivalent en Java List
est l'interface Seq
. Il existe également une interface plus générale, qui est la GenSeq
-- la principale différence étant qu'un GenSeq
peut avoir des opérations traitées en série ou en parallèle, selon l'implémentation.
Parce que Scala permet aux programmeurs d'utiliser Seq
en tant qu'usine, ils ne prennent pas souvent la peine de définir une implémentation particulière, à moins qu'ils ne s'y intéressent. Lorsqu'ils le font, ils choisissent généralement l'une ou l'autre des implémentations suivantes de Scala List
o Vector
. Ils sont tous deux immuables, et Vector
a de bonnes performances en matière d'accès indexé. D'un autre côté, List
fait très bien les opérations qu'il fait bien.
Quelle collection Scala a des caractéristiques similaires à ArrayList
?
Ce serait scala.collection.mutable.ArrayBuffer
.
Quel est un bon remplacement pour Array
en Scala ?
Eh bien, la bonne nouvelle, c'est que vous pouvez simplement utiliser Array
en Scala ! En Java, Array
est souvent évitée en raison de son incompatibilité générale avec les génériques. C'est une collection co-variante, alors que les génériques sont invariants, elle est mutable -- ce qui rend sa co-variance dangereuse, elle accepte des primitives là où les génériques ne le font pas, et elle a un ensemble assez limité de méthodes.
En Scala, Array
-- qui est toujours le même Array
comme en Java -- est invariant, ce qui fait disparaître la plupart des problèmes. Scala accepte AnyVal
(l'équivalent des primitives) comme types pour ses "génériques", même s'il fait de l'auto-boxing. Et par le biais du modèle "enrichir ma bibliothèque", TOUTES de Seq
Les méthodes sont disponibles pour Array
.
Donc, si vous voulez une plus puissante Array
il suffit d'utiliser un Array
.
Qu'en est-il d'une collection qui rétrécit et s'agrandit ?
Les méthodes par défaut disponibles pour toutes les collections produisent toutes nouveau des collections. Par exemple, si je fais ça :
val ys = xs filter (x => x % 2 == 0)
Puis ys
sera un nouveau tandis que xs
sera toujours la même qu'avant cette commande. Ceci est vrai quel que soit le xs
était : Array
, List
etc.
Naturellement, cela a un coût - après tout, vous sont produire une nouvelle collection. Les collections immuables de Scala gèrent bien mieux ce coût car elles sont persistant mais cela dépend de l'opération exécutée.
Aucune collection ne peut faire grand-chose filter
mais un List
a d'excellentes performances lorsqu'il s'agit de générer une nouvelle collection en ajoutant un élément ou en enlevant la tête - les opérations de base d'une pile, en fait. Vector
a de bonnes performances sur un tas d'opérations, mais il n'est rentable que si la collection n'est pas petite. Pour les collections de, disons, jusqu'à une centaine d'éléments, le coût global pourrait dépasser les gains.
Il est donc possible d'ajouter ou de supprimer des éléments à un fichier Array
et Scala produira un nouveau Array
pour vous, mais vous paierez le coût d'une copie complète si vous le faites.
Les collections mutables de Scala ajoutent quelques autres méthodes. En particulier, les collections qui peuvent augmenter ou diminuer la taille -- sans produire une nouvelle collection -- implémentent la méthode Growable
y Shrinkable
traits. Ils ne garantissent cependant pas de bonnes performances sur ces opérations, mais ils vous indiqueront les collections que vous souhaitez consulter.