在 C# 中,List
List 的容量与扩容机制
1.容量(Capacity)与计数(Count)
- Capacity: List
内部分配的存储空间(以元素个数为单位)。这是数组的实际长度。 - Count: 当前 List
中存储的元素数量。
List
2.扩容触发机制
当添加新元素时,如果 Count + 1 超过当前 Capacity:
- 分配一个新的数组,其长度为当前 Capacity 的两倍。如果当前容量为 0,则扩容为默认初始值(通常为 4)。
- 将现有数组中的元素复制到新数组。
- 将新数组替换为 List
的内部存储。
3.扩容倍增策略
每次扩容,List
4.手动控制容量
可以通过 List
- EnsureCapacity: 确保 List
的容量至少为指定值。list.EnsureCapacity(100); - TrimExcess: 将 Capacity 调整为当前 Count 的大小(如果 Count 足够接近 Capacity)。list.TrimExcess();
- Capacity 属性: 可手动设置容量值。list.Capacity = 50; // 设置容量为 50
代码示例
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List numbers = new List();
Console.WriteLine($"Initial Capacity: {numbers.Capacity}");
for (int i = 1; i <= 10; i++)
{
numbers.Add(i);
Console.WriteLine($"Count: {numbers.Count}, Capacity: {numbers.Capacity}");
}
}
}
输出示例
Initial Capacity: 0
Count: 1, Capacity: 4
Count: 2, Capacity: 4
Count: 3, Capacity: 4
Count: 4, Capacity: 4
Count: 5, Capacity: 8
Count: 6, Capacity: 8
Count: 7, Capacity: 8
Count: 8, Capacity: 8
Count: 9, Capacity: 16
Count: 10, Capacity: 16
扩容的优点与缺点
优点
- 动态扩容减少了开发者手动管理数组大小的麻烦。
- 扩容机制的指数式增长减少了扩容的频率,从而提升性能。
缺点
- 每次扩容都会重新分配数组和复制数据,可能会引发性能开销(尤其是大数组)。
- 在内存敏感场景中,大量未使用的预留容量可能造成浪费。
优化建议
- 预估容量:
- 如果能够预估集合的大小,可以在初始化时设置合适的容量,避免频繁扩容。
- List
numbers = new List (100); - 使用 TrimExcess:
- 在完成所有操作后,调用 TrimExcess 释放多余的容量。
- numbers.TrimExcess();
- 使用 EnsureCapacity:
- 在添加大量元素之前,使用 EnsureCapacity 一次性增加容量。
总结
C# 中 List
本文暂时没有评论,来添加一个吧(●'◡'●)