内部的には配列として扱われますか、それともCLRによってまったく異なるタイプとして扱われますか?
リストに整数値を実装しようとしています。
List<int> lst = new List<int>();
lst.Add(3);
lst.Add(4);
対。
整数の配列を作成します
int[] arr = new int[2];
arr[0] = 3;
arr[1] = 4;
配列はより良いタイムスパンの結果を返します。では、なぜ人々はList<>を好むのでしょうか。
List<>
オンデマンドベースでメモリの割り当てを処理するデータ構造の実装です。任意のインデックスなどでの挿入と削除が可能です。したがって、単純な配列よりもはるかに便利です。
内部的には、現在のList<>
実装ではストレージに配列を使用しており、配列のような操作を行う場合のオーバーヘッドは最小限に抑えられています。追加された利便性は、通常、パフォーマンスのわずかな違い(関連する場合でも)の価値があります。リストはメモリのチャンクを割り当て、追加のたびに新しい割り当てとコピーを必要としないため、アイテムの追加は通常高速です(Length
が常にメモリ内のサイズにバインドされている純粋な配列と比較して)。
通常のランダムアクセスリストには通常、内部配列があります。.NETList<T>
実装はこれを行います。LinkedList<T>
配列の代わりに参照を持つ要素のチェーンを使用するなどの他の実装。よりエキゾチックなリストでは、順序付けに内部的にツリーを使用する場合があります。
の内部配列List<T>
は短い長さ(4と思います)で初期化され、配列の最大境界の外側に追加しようとすると、拡張されます。これには時間がかかる可能性があるため(配列をコピーする必要があります)、配列のサイズは2倍になります。つまり、5番目の要素を追加すると、内部配列の長さが8に変更されます。