これはスタイルと好みの問題ですが、ここに行きます:いつscala.Arrayを使うべきですか?私はいつもListを使用していて、SeqやMapなどに出くわすこともありますが、実際にArrayを使用したことも、見たこともありません。Javaとの互換性のためだけにありますか?一般的なユースケースがありませんか?
3 に答える
まず、ここで免責事項を作成しましょう。Scala 2.7は、JavaとScalaコレクションを同時に実現Array
しようとしています。Array
ほとんど成功しますが、一部のコーナーケースでは両方で失敗します。残念ながら、これらのコーナーケースは通常のコードを持っている善良な人々に起こる可能性があるので、Scala2.8はそれから逸脱しています。
Scala 2.8には、 Array
JavaであるがありますArray
。つまり、これは連続したメモリスペースであり、参照またはプリミティブのいずれかを格納し(したがって、要素サイズが異なる場合があります)、非常に高速にランダムにアクセスできます。また、お粗末なメソッドと恐ろしいtoString
実装があり、ジェネリックスとプリミティブを同時に使用するとパフォーマンスが低下します(例:) def f[T](a: Array[T]) = ...; f(Array(1,2,3))
。
そして、がありますGenericArray
。これは、に裏打ちされたScalaコレクションArray
です。常にボックス化されたプリミティブを格納するため、プリミティブとジェネリックを混合するときにパフォーマンスの問題は発生しませんが、一方で、純粋なプリミティブ(非ジェネリック)プリミティブ配列のパフォーマンスの向上はありません。
では、いつ何を使うのですか?AnArray
には次の特徴があります。
- O(1)ランダムな読み取りと書き込み
- O(n)追加/追加/挿入/削除
- 可変
ジェネリックスが必要ない場合、またはジェネリックスをとして記述できる場合は[T <: AnyRef]
、プリミティブを除外AnyVal
します。これらの特性はコードに最適であり、それを選択します。
プリミティブを含むジェネリックスが必要であり、それらの特性がコードに最適である場合は、Scala2.8で使用GenericArray
してください。また、すべてのメソッドを含む真のコレクションが必要な場合は、暗黙的な変換に依存するのではなく、それも使用することをお勧めします。
不変性が必要な場合、または追加、追加、挿入、削除に優れたパフォーマンスが必要な場合は、他のコレクションを探してください。
配列は、同じ (または互換性のある) クラスのアイテムが多数あり、それらのアイテムの正確な数または妥当な上限が事前にわかっていて、高速ランダム アクセスに関心がある場合に適しています。 -項目の変更を配置しますが、設定後は、リストのどこかに項目を挿入または削除することはありません.
別の言い方をすれば、Collection 型より付加機能が少なく、使用方法に応じてオーバーヘッドがわずかに少なく、パフォーマンスがわずかに優れた集計データ構造です。
非常に不自然な例: あなたは関数を作成するビジネスを行っており、これらの関数の品質テストには、1000 個の固定入力値のセットに対するパフォーマンスまたは結果のチェックが含まれます。さらに、これらの値をファイルに保持するのではなく、プログラムにハード コードすることにします。配列が適切です。
Java API とのインターフェースは 1 つのケースです。また、Java 配列とは異なり、scala 配列は不変であるため、リストよりも利点がありません。