157

どのような場合に Array(Buffer) と List(Buffer) を使用する必要があります。私が知っている唯一の違いは、配列は不変であり、リストは共変であるということです。しかし、パフォーマンスやその他の特性についてはどうでしょうか?

4

3 に答える 3

165

不変の構造

ScalaListは不変の再帰的データ構造であり、Scala の基本的な構造であるため、(おそらく) よりもはるかに多く使用する必要がありますArray(これは実際には可変であり、 isの不変のアナログです)。ArrayIndexedSeq

Java のバックグラウンドを持っている場合、明らかな類似点はLinkedListoverを使用する場合ArrayListです。前者は通常、トラバースされるだけの(そしてそのサイズが事前にわからない) リストに使用され、後者は既知のサイズ (または最大サイズ) を持つリスト、または高速なランダム アクセスが重要なリストに使用されます。

可変構造

ListBufferへの一定時間の変換を提供します。これは、後の変換が必要な場合Listに使用する唯一の理由です。ListBuffer

scalaArrayは Java 配列によって JVM に実装する必要があるため、は (新しい機能を備えた最新バージョンの Scala を使用していない限り、コンテンツをボックス化する) よりもArray[Int]( として) はるかにパフォーマンスが高い可能性があります。 .int[]List[Int]@specialized

ただし、ArrayScala での s の使用は最小限に抑える必要があると思います。なぜなら、配列が必要なプリミティブ型によって実際にサポートされるかどうかを判断するために、内部で何が起こっているかを本当に知る必要があるように感じるからです。ラッパータイプとしてボックス化されます。

于 2010-04-26T11:17:41.260 に答える
136

すでに投稿された回答に加えて、ここにいくつかの詳細があります。

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)

したがって、迅速なランダム アクセスが必要な場合、要素をカウントする必要がある場合、または何らかの理由で破壊的な更新が必要な場合を除き、aListArray.

于 2010-04-26T12:44:22.500 に答える
19

配列は変更可能です。つまり、各インデックスの値を変更できます。一方、リスト (デフォルト) は変更不可であり、変更を行うたびに新しいリストが作成されます。ほとんどの場合、不変データ型を操作するのはより「機能的な」スタイルであり、おそらく、などyieldの構造を持つ List を試して使用する必要があります。foreachmatch

パフォーマンス特性については、要素へのランダム アクセスでは配列の方が高速ですが、新しい要素を前に追加 (追加) する場合はリストの方が高速です。それらを反復することは同等です。

于 2010-04-26T11:19:55.953 に答える