C#Arraylist中的容量属性

Sha*_*ati 0 c#

我在C#中浏览了Arraylist的属性.我做的是:

ArrayList listInt = new ArrayList();
listInt.Add(9);
listInt.Add(10);
listInt.Add(11);
Console.WriteLine($"Capacity Before: {listInt.Capacity}");
Run Code Online (Sandbox Code Playgroud)

输出为4,很好.接下来我尝试了AddRange()属性:

ArrayList list2 = new ArrayList();
list2.Add("SAM");
list2.Add("MAN");
list2.Add("TAN");
listInt.AddRange(list2);
Console.WriteLine($"Capacity After: {listInt.Capacity}");
Run Code Online (Sandbox Code Playgroud)

输出为8.

产量

一个

我的ArrayList的容量如何变为8?

AAA*_*ddd 7

因为您在列表中添加了3个元素...

Capacity是内部数组的大小...它从0开始,然后在第一次添加时默认为4.当它需要更多容量时,它会上升2倍.这使内存复制保持最小(以少量内存为代价).

注意:尽管不要混淆Capacity,Count但它们是不同的东西

您向阵列添加3个元素

ArrayList listInt = new ArrayList(); // capacity = 0 
listInt.Add(9);                      // capacity = 4
listInt.Add(10);                     // capacity = 4
listInt.Add(11);                     // capacity = 4
Run Code Online (Sandbox Code Playgroud)

因此,当您将第一个元素添加到列表时,内部Add调用EnsureCapacity.看起来像这样(完全来源)

private const int _defaultCapacity = 4;

...
private void EnsureCapacity(int min)
{
   if (_items.Length < min)
   {
      int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Length * 2;
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

注意_items.Length * 2......

listInt.AddRange(list2);             // capacity = 8
Run Code Online (Sandbox Code Playgroud)

您的列表中可能只有3个元素,但容量为4.现在添加3个元素,没有其他选择,然后将容量乘以2


List.Capacity属性

获取或设置内部数据结构在不调整大小的情况下可以保留的元素总数.

List.Count属性

获取List中包含的元素数.