Подтвердить что ты не робот

Значение по умолчанию для списка

Какова емкость списка по умолчанию?

4b9b3361

Ответ 1

Почему бы вам просто не попробовать?

Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);

Этот ответ будет работать во всех версиях .NET, имеющих список. В моей версии это 0.

Ответ 2

Согласно образцу документации конструктора без параметров MSDN, начальная емкость списка, созданного с помощью

List<string> x = new List<string>();

равно 0. Насколько я могу судить, это не задокументировано как гарантия, и политика изменения размера не документирована (т.е. в настоящее время она может удваиваться с минимумом 4, но в .NET 5.0 она может втрое с минимум 128.) Вы не должны полагаться на это поведение в основном.

Ответ 3

На самом деле, он начинается с Capacity 0. Когда вы добавляете первый элемент, текущая реализация выделяет емкость 4. После этого емкость удваивается, если требуется расширение, чтобы гарантировать амортизацию 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);
    }
}

Ответ 4

Емкость по умолчанию для списка - это 4 элемента (после того, как вы вставляете исходный элемент, в противном случае он имеет размер 0)

var list = new List<int>();
list.Add(1);

Assert.AreEqual(4, list.Capacity);

Ответ 5

Все это лежит в одной строке, чтобы обеспечить возможность хранения другого элемента:

int num = this._items.Length == 0 ? 4 : this._items.Length * 2;

Получил это из mscorlib 4.0.0.0 deassebled - конечно, как сказал Джон, это не может быть гарантировано не измениться в будущем (пока он все еще остается в 0, 4, 8, 16...).

Конечно, вы можете настроить его самостоятельно, чтобы это могло быть 3, 9, 27 и т.д.

Ответ 6

Емкость должна использоваться, если вы знаете, сколько элементов вы хотите сохранить в списке (или в стеке или в очереди).

В этом случае вы избежите копирования памяти. Копирование памяти происходит из-за того, что под списком капель (стеки и очереди) полагаются на массив для хранения своих элементов. Этот размер массива - это емкость, но это не то же самое, что размер списка. Поскольку размер списка должен быть больше размера массива, реализация List будет выделять более крупный массив (коэффициент 2 может быть меньше) и скопирует все элементы из старого массива в новый, а также добавленные новые элементы.

Итак, если вы знаете, что у вас может быть, скажем, от 50 до 60 элементов в вашем списке, создайте список с емкостью 60 и освобождение памяти не произойдет.

Примечание. И похоже, что сборщику мусора не придется очищать старые массивы