我在C#中浏览了Arraylist的属性。我做的是:
ArrayList listInt = new ArrayList();
listInt.Add(9);
listInt.Add(10);
listInt.Add(11);
Console.WriteLine($"Capacity Before: {listInt.Capacity}");
输出为4,很好。 接下来我尝试了AddRange()属性:
ArrayList list2 = new ArrayList();
list2.Add("SAM");
list2.Add("MAN");
list2.Add("TAN");
listInt.AddRange(list2);
Console.WriteLine($"Capacity After: {listInt.Capacity}");
输出为8。
输出
我的ArrayList的容量如何变为8?
答案 0 :(得分: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
因此,当您将第一个元素添加到列表中时,内部Add
会调用EnsureCapacity
。看起来像这样(Full Source Here)
private const int _defaultCapacity = 4;
...
private void EnsureCapacity(int min)
{
if (_items.Length < min)
{
int newCapacity = _items.Length == 0 ? _defaultCapacity : _items.Length * 2;
...
}
}
记下_items.Length * 2
...
listInt.AddRange(list2); // capacity = 8
您的列表中可能只有3个元素,但容量为4.现在您添加了3个元素,它没有其他选择,然后将容量乘以2
获取或设置内部数据结构的元素总数 可以在不调整大小的情况下持有。
获取List中包含的元素数。