List 的默认容量是多少?
7 回答
实际上,它从容量 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);
}
}
你为什么不试试呢?
Console.WriteLine("Default capacity of a List: " + new List<int>().Capacity);
此答案适用于所有具有列表的 .NET 版本。在我的版本中,它恰好是 0。
根据MSDN 无参数构造函数文档上的示例,创建的列表的初始容量为:
List<string> x = new List<string>();
是 0。据我所知,这没有记录为保证,调整大小策略也没有记录(即,它目前可能会翻倍,至少 4,但在 .NET 5.0 中,它可能会增加三倍,至少 128 .) 基本上,您不应该依赖这种行为。
List 的默认容量为 4 项(插入初始项后,否则为 0 大小)
var list = new List<int>();
list.Add(1);
Assert.AreEqual(4, list.Capacity);
容量默认值为 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方法也不会影响它。
如果您大致知道要在列表(或堆栈或队列)中存储多少项目,则应使用容量。
在这种情况下,您将避免内存复制。发生内存复制是因为在底层列表(堆栈和队列)依赖数组来存储它们的项目。该数组大小是您的容量,但它与列表大小不同。由于列表的大小需要大于数组的大小,因此 List 实现将分配一个更大的数组(因子 2 可能更小)并将所有项目从旧数组复制到新数组加上新添加的项目。
因此,如果您知道列表中可能有 50 到 60 个项目,请创建一个容量为 60 的列表,并且不会发生内存释放。
注意:看起来垃圾收集器不必清理旧数组
这一切都在于确保容量能够存储另一个元素:
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 等。