Какова емкость списка по умолчанию?
Значение по умолчанию для списка
Ответ 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 и освобождение памяти не произойдет.
Примечание. И похоже, что сборщику мусора не придется очищать старые массивы