Dies ist eher eine Frage des Stils und der Vorliebe, aber hier gilt: Wann sollte ich scala.Array verwenden? Ich benutze List die ganze Zeit und gelegentlich in Seq, Map und dergleichen, aber ich habe nie Array in der Wildnis verwendet oder gesehen. Ist es nur für Java-Kompatibilität da? Fehle ich einen gemeinsamen Anwendungsfall?
Zuerst machen wir hier einen Haftungsausschluss. Scala 2.7's Array
versucht gleichzeitig eine Java Array
und eine Scala Collection zu sein. Es gelingt meistens, aber bei einigen Fällen scheitert es an beiden. Leider können diese Fälle mit guten Leuten mit normalem Code passieren, weshalb Scala 2.8 davon abweicht.
In Scala 2.8 gibt es Array
, was Java Array
ist. Das bedeutet, dass es sich um einen zusammenhängenden Speicherbereich handelt, der entweder Referenzen oder Grundelemente speichert (und daher unterschiedliche Elementgrößen haben kann) und auf die nach dem Zufallsprinzip schnell zugegriffen werden kann. Es hat auch lausige Methoden, eine schreckliche toString
Implementierung, und funktioniert schlecht wenn Generics und Primitive gleichzeitig verwendet werden (zB: def f[T](a: Array[T]) = ...; f(Array(1,2,3))
).
Und dann gibt es GenericArray
, was eine Scala Collection ist, die von einem Array
unterstützt wird. Es speichert immer Boxed-Primitive, so dass es keine Performance-Probleme beim Mischen von Primitiven und Generics hat, aber andererseits nicht die Leistungssteigerungen eines rein primitiven (nicht-generischen) Primitivarrays aufweist.
Also wann wann was benutzen? Ein Array
hat die folgenden Eigenschaften:
Wenn Sie keine Generika benötigen oder Ihre Generika als [T <: AnyRef]
angegeben werden können, also Primitive ausschließen, die AnyVal
sind, und diese Eigenschaften für Ihren Code optimal sind, dann gehen Sie dafür.
Wenn Sie Generics, einschließlich Primitiven, benötigen und diese Eigenschaften für Ihren Code optimal sind, verwenden Sie GenericArray
auf Scala 2.8. Wenn Sie eine echte Sammlung mit all ihren Methoden wünschen, können Sie sie auch verwenden, anstatt von impliziten Konvertierungen abhängig zu sein.
Wenn Sie Unveränderbarkeit wünschen oder eine gute Leistung zum Anhängen, Vorbereiten, Einfügen oder Löschen benötigen, suchen Sie nach einer anderen Sammlung.
Ein Array eignet sich, wenn Sie mehrere Elemente der gleichen (oder kompatiblen) Klasse haben und Sie im Voraus die genaue Anzahl dieser Elemente oder eine vernünftige obere Grenze kennen und an einem schnellen Direktzugriff interessiert sind und vielleicht eine direkte Änderung von Elementen, aber nach dem Einrichten werden Sie niemals Objekte von irgendwo in der Liste einfügen oder entfernen.
Oder anders gesagt, es ist eine aggregierte Datenstruktur mit weniger Schnickschnack als die Collection-Typen, mit etwas weniger Overhead und etwas besserer Leistung, je nachdem, wie sie verwendet wird.
Ein sehr durchdachtes Beispiel: Sie produzieren Funktionen, und Qualitätsprüfungen für diese Funktionen beinhalten die Überprüfung ihrer Leistung oder Ergebnisse für einen Satz von 1000 festen Eingabewerten. Darüber hinaus entscheiden Sie, diese Werte nicht in einer Datei zu belassen, sondern sie in Ihrem Programm fest zu codieren. Ein Array wäre angemessen.
Die Schnittstelle zu Java-APIs ist ein Fall. Im Gegensatz zu Java-Arrays sind Scala-Arrays invariant und haben daher keinen Vorteil gegenüber Listen.
Tags und Links scala arrays coding-style scala-collections