62

List 的默认容量是多少?

4

7 回答 7

63

实际上,它从容量 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);
    }
}
于 2009-11-19T12:03:43.210 回答
60

你为什么不试试呢?

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

此答案适用于所有具有列表的 .NET 版本。在我的版本中,它恰好是 0。

于 2009-11-19T12:01:14.120 回答
46

根据MSDN 无参数构造函数文档上的示例,创建的列表的初始容量为:

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

是 0。据我所知,这没有记录为保证,调整大小策略也没有记录(即,它目前可能会翻倍,至少 4,但在 .NET 5.0 中,它可能会增加三倍,至少 128 .) 基本上,您不应该依赖这种行为。

于 2009-11-19T12:02:28.533 回答
7

List 的默认容量为 4 项(插入初始项后,否则为 0 大小)

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

Assert.AreEqual(4, list.Capacity);
于 2009-11-19T12:00:38.910 回答
3

容量默认值为 0,但如果您创建一个空白列表 [ List1 ],如下所示。如果您创建的列表有如下 [ List2 ] 中的元素,则您添加的元素数量变为 N over 2。默认容量会有所不同。

List<int> List1 = new List<int>(); //count=0, capacity=0
List<int> List2 = new List<int>(){ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; //count=11, capacity=16

添加Array类型的元素后,开发人员使用ReSize方法扩展了数组。它工作得非常缓慢。在开发List类型的同时,容量也得到了一定的提升。该比率已发展为 N 大于 2。

如果添加到列表中的成员数量超过了,则当前容量会增加一倍。如果您从列表中删除某些值,容量不会减少。容量只会增加,不会减少。即使是Clear方法也不会影响它。

于 2020-02-24T07:40:46.273 回答
1

如果您大致知道要在列表(或堆栈或队列)中存储多少项目,则应使用容量。

在这种情况下,您将避免内存复制。发生内存复制是因为在底层列表(堆栈和队列)依赖数组来存储它们的项目。该数组大小是您的容量,但它与列表大小不同。由于列表的大小需要大于数组的大小,因此 List 实现将分配一个更大的数组(因子 2 可能更小)并将所有项目从旧数组复制到新数组加上新添加的项目。

因此,如果您知道列表中可能有 50 到 60 个项目,请创建一个容量为 60 的列表,并且不会发生内存释放。

注意:看起来垃圾收集器不必清理旧数组

于 2013-10-24T12:09:55.413 回答
0

这一切都在于确保容量能够存储另一个元素:

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

从 mscorlib 4.0.0.0 deassebled 得到这个 - 当然,正如 Jon 所说,这不能保证将来不会改变(到目前为止它仍然保持在 0、4、8、16 ......)。

当然,您可以自己设置,因此可以是 3、9、27 等。

于 2013-10-24T11:56:30.317 回答