リストのデフォルトの容量はどれくらいですか?
7 に答える
実際には、容量0から始まります。最初の要素を追加すると、現在の実装では容量4が割り当てられます。その後、拡張が必要な場合、容量は2倍になり、償却されたO(1)操作が保証されます。
これが現在の動作であることに注意してください。あなたはそれが事実であると頼るべきではありません。これは、現在の動作を示しているはずです。
List<int> list = new List<int>();
int capacity = list.Capacity;
Console.WriteLine("Capacity: " + capacity);
for (int i = 0; i < 100000; i++)
{
list.Add(i);
if (list.Capacity > capacity)
{
capacity = list.Capacity;
Console.WriteLine("Capacity: " + capacity);
}
}
試してみませんか?
Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);
この回答は、リストがある.NETのすべてのバージョンで機能します。私のバージョンでは、たまたま0です。
MSDNのパラメーターなしのコンストラクタードキュメントのサンプルによると、リストの初期容量は次のように作成されます。
List<string> x = new List<string>();
私の知る限り、これは保証として文書化されておらず、サイズ変更ポリシーも文書化されていません(つまり、現在、最小4で2倍になる可能性がありますが、.NET5.0では最小128で3倍になる可能性があります。 。)基本的に、この動作に依存するべきではありません。
リストのデフォルトの容量は4アイテムです(最初のアイテムを挿入した後、それ以外の場合はサイズが0です)
var list = new List<int>();
list.Add(1);
Assert.AreEqual(4, list.Capacity);
リスト (またはスタック、またはキュー) に保存するアイテムの数が大体わかっている場合は、容量を使用する必要があります。
この場合、メモリのコピーを回避できます。内部でリスト (スタックとキュー) がアイテムを格納するために配列に依存しているため、メモリのコピーが発生します。その配列のサイズは容量ですが、リストのサイズとは異なります。リストのサイズは配列のサイズよりも大きくする必要があるため、List の実装はより大きな配列 (おそらく 2 分の 1 未満) を割り当て、すべての項目を古い配列から新しい配列と新しく追加された項目にコピーします。
したがって、たとえば、リストに 50 ~ 60 個の項目があることがわかっている場合は、容量 60 のリストを作成すると、メモリの割り当てが解除されません。
注: また、ガベージ コレクターは古いアレイをクリーンアップする必要がないようです。