回答:
ScalaはList
あなたが(おそらく)よりもはるかにそれを使用しなければならないことを、Scalaでは、このような基本構造である不変の再帰的なデータ構造であるArray
(実際にある可変 - 不変アナログのArray
ですIndexedSeq
)。
Javaのバックグラウンドを使用LinkedList
している場合、明らかな類似点は、いつover を使用するかArrayList
です。前者は通常、トラバースされるだけの(かつ、サイズが事前にわからない)リストに使用されますが、後者は、既知のサイズ(または最大サイズ)または高速ランダムアクセスが重要なリストに使用する必要があります。
ListBuffer
は、への定数時間変換を提供します。List
これは、このListBuffer
ような後の変換が必要な場合にのみ使用する理由です。
ScalaはArray
Java配列によってJVM上で実施されるべきであり、それゆえArray[Int]
はるかにパフォーマンス(ようなものであってもよいint[]
)よりもList[Int]
(あなたが新しい持つスカラ座の非常に最新のバージョンを使用している場合を除き、その内容をボックスなる@specialized
機能) 。
ただし、Array
Scala でのs の使用は最小限に抑える必要があると思います。なぜなら、配列が本当に必要なプリミティブ型によって裏付けられるかどうかを判断するには、内部で何が行われているのかを本当に知る必要があるからです。ラッパータイプとしてボックス化されます。
既に投稿された回答に加えて、ここにいくつかの詳細があります。
しながら、Array[A]
文字通りJava配列である、List[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)
したがって、迅速なランダムアクセスが必要な場合、要素をカウントする必要がある場合、または何らかの理由で破壊的な更新が必要な場合を除いて、a List
はArray
。
list = list.drop(i)
。または、フードの背後で何らかの魔法が発生しますか?
drop
は、ドロップされなかったリストの部分を決してコピーする必要がないことに注意してください。たとえば、(x::xs).drop(1)
は正確にxs
であり、の「コピー」ではありませんxs
。
配列は変更可能です。つまり、各インデックスの値を変更できます。リスト(デフォルト)は不変です。つまり、変更を行うたびに新しいリストが作成されます。ほとんどの場合、それは不変のデータ型の仕事に多くの「機能的」なスタイルで、あなたはおそらくしようとするような構築物でリストを使用する必要がありyield
、foreach
、match
など。
パフォーマンス特性については、要素へのランダムアクセスを使用すると配列が高速になりますが、新しい要素を先頭に追加(追加)するときはリストが高速になります。それらを繰り返すことは同等です。
iterate over
キャッシュのため、配列はリストよりもはるかに高速に実行されます