どのような場合に Array(Buffer) と List(Buffer) を使用する必要があります。私が知っている唯一の違いは、配列は不変であり、リストは共変であるということです。しかし、パフォーマンスやその他の特性についてはどうでしょうか?
3 に答える
不変の構造
ScalaList
は不変の再帰的データ構造であり、Scala の基本的な構造であるため、(おそらく) よりもはるかに多く使用する必要がありますArray
(これは実際には可変であり、 isの不変のアナログです)。Array
IndexedSeq
Java のバックグラウンドを持っている場合、明らかな類似点はLinkedList
overを使用する場合ArrayList
です。前者は通常、トラバースされるだけの(そしてそのサイズが事前にわからない) リストに使用され、後者は既知のサイズ (または最大サイズ) を持つリスト、または高速なランダム アクセスが重要なリストに使用されます。
可変構造
ListBuffer
への一定時間の変換を提供します。これは、後の変換が必要な場合List
に使用する唯一の理由です。ListBuffer
scalaArray
は Java 配列によって JVM に実装する必要があるため、は (新しい機能を備えた最新バージョンの Scala を使用していない限り、コンテンツをボックス化する) よりもArray[Int]
( として) はるかにパフォーマンスが高い可能性があります。 .int[]
List[Int]
@specialized
ただし、Array
Scala での s の使用は最小限に抑える必要があると思います。なぜなら、配列が必要なプリミティブ型によって実際にサポートされるかどうかを判断するために、内部で何が起こっているかを本当に知る必要があるように感じるからです。ラッパータイプとしてボックス化されます。
すでに投稿された回答に加えて、ここにいくつかの詳細があります。
anArray[A]
は文字通り Java 配列ですが、 aList[A]
は不変のデータ構造であり、Nil
(空のリスト) であるか、またはペアで構成されてい(A, List[A])
ます。
パフォーマンスの違い
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
メモリの違い
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
したがって、迅速なランダム アクセスが必要な場合、要素をカウントする必要がある場合、または何らかの理由で破壊的な更新が必要な場合を除き、aList
はArray
.
配列は変更可能です。つまり、各インデックスの値を変更できます。一方、リスト (デフォルト) は変更不可であり、変更を行うたびに新しいリストが作成されます。ほとんどの場合、不変データ型を操作するのはより「機能的な」スタイルであり、おそらく、などyield
の構造を持つ List を試して使用する必要があります。foreach
match
パフォーマンス特性については、要素へのランダム アクセスでは配列の方が高速ですが、新しい要素を前に追加 (追加) する場合はリストの方が高速です。それらを反復することは同等です。