列表的默认容量

什么是列表的默认容量?

你为什么不试试呢?

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

这个答案将适用于所有版本的有List的.NET。 在我的版本,它恰好是0。

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

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

是0.据我所知,这不是作为一个保证logging,也没有loggingresize的政策(即它可能目前加倍至less4,但在.NET 5.0中,它可以三倍至less128 )基本上你不应该依赖这种行为。

实际上,它的容量是从0开始的。当你添加第一个元素时,当前的实现分配一个4的容量。之后,如果需要扩展,容量保持翻倍,以保证O(1)操作的分期偿还。

请记住,这是目前的行为。 你不应该依赖于这种情况。 这应该certificate当前的行为:

 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); } } 

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

 var list = new List<int>(); list.Add(1); Assert.AreEqual(4, list.Capacity); 

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

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

从mscorlib 4.0.0.0得到这个反汇编 – 当然,正如乔恩所说,这不能保证在未来不会改变(到目前为止,它仍然停留在0,4,8,16 …)。

当然,你可以自己设定,所以这可以是3,9,27等。

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

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

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

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