web-dev-qa-db-ja.com

配列と配列リストの大きな違いは?

可能性のある複製:
c#?のarray []でArrayListを使用する場合

メモリまたはプロセッサのコストの観点から、配列とarrayListオブジェクトの間に大きな違いがあるように見えますか?

16
Mike Olson

配列は、基本的にメモリ内の領域にマッピングされる低レベルのデータ構造です。 ArrayListは、リストが大きくなるにつれて再割り当てされるobjectの配列として実装される可変長リストです。

したがって、ArrayListには、内部配列のサイズの管理に関連するオーバーヘッドと、リストにアクセスするときにオブジェクトを正しい型にキャストすることに関連するオーバーヘッドがあります。

また、すべてをobjectとして保存することは、値の型が書き込み時にボックス化され、読み取り時にボックス化解除されることを意味します。これはパフォーマンスに非常に有害です。 List<T>を使用すると、類似しているが厳密に型指定された可変サイズリストにより、この問題を回避できます。

実際、ArrayListは、.NET 2.0以降、List<T>を優先して実質的に非推奨になりました。

6
Asik

配列は固定サイズの連続したメモリブロックです。一方、ArrayList(.NET 2.0以降はListをお勧めしますが)は配列をラップして、動的にサイズ変更可能なストレージを提供します。

それらの「違い」は、それらがカプセル化されている限り、ArrayListはサイズ変更可能であり、配列はサイズ変更可能でないことです。実装に関する限り:ArrayListは配列をラップ(および再割り当て)するため、配列よりもわずかに多くのメモリが必要になります(容量ではなく、現在の要素数を知る必要があるため)。さらに、ArrayListも内部容量に達すると、内部配列を再割り当てしてコピーするためにCPU時間を必要とします。

ただし、ArrayListのインスタンス化は、配列の割り当てほど高価ではありません。唯一の違いは、ArrayListの状態を初期化するために必要な命令が少数であることです。違いは無視でき、心配する価値はありません。

サイズ変更可能なコレクションを作成する手段として自分で配列を再割り当てする場合は、徹底的にテストされているため、ArrayList/Listを使用した方がよいことがわかります。

1
Dai