私は scala/java の初心者なので、この 2 つの違いを理解するのに苦労しています。
スカラを読むことでドキュメントArrayBuffer
インタラクティブに(追加、挿入、先頭に追加など)実行できるように作成されていることを理解しました。
1) 基本的な実装の違いは何ですか?
2) これら 2 つの間にパフォーマンスの違いはありますか?
ベストアンサー1
Array
と は両方ともArrayBuffer
変更可能です。つまり、特定のインデックスの要素を変更できます。a(i) = e
ArrayBuffer
はサイズ変更可能でArray
はありません。 に要素を追加するとArrayBuffer
、 は大きくなります。 に要素を追加しようとするとArray
、新しい配列が作成されます。したがって、Array
を効率的に使用するには、事前にそのサイズを知っておく必要があります。
Array
は JVM レベルで実装されており、消去されない唯一の汎用型です。つまり、オブジェクトのシーケンスを格納する最も効率的な方法であり、余分なメモリ オーバーヘッドがなく、一部の操作は単一の JVM オペコードとして実装されます。
ArrayBuffer
は内部的にを持ち、必要に応じて新しいものを割り当てることで実装されますArray
。追加は通常は高速ですが、制限に達して配列のサイズが変更される場合は別です。ただし、全体的な影響は無視できるほど小さい方法で行われるため、心配する必要はありません。先頭への追加は、すべての要素を右に移動し、新しい要素を 0 番目の要素として設定することで実装されるため、低速です。追加んループ内の要素は効率的です(お(ん)) の場合、先頭に付けるのは (お(ん²))。
Array
は組み込み値型 ( を除くUnit
) に特化されているため、 はArray[Int]
よりもはるかに最適になりますArrayBuffer[Int]
。値をボックス化する必要がないため、メモリ使用量と間接参照が少なくなります。この特化は、常に、型が単相である場合にのみ機能することに注意してください。つまり、 はArray[T]
常にボックス化されます。