5.CSharp中的List如何扩容
5.1 题目
说明C#中的List是如何扩容的?
5.2 深入解析
在C#中,List<T> 是一个动态数组,其容量可以根据需要动态扩展。了解List<T>的扩容机制有助于更好地管理内存和优化性能。下面是关于List<T>扩容的详细说明。
扩容机制
当向List<T>中添加元素且容量不足时,List<T>会自动扩容。具体的扩容机制如下:
初始容量:
List<T>在创建时可以指定初始容量(capacity),如果没有指定,则初始容量默认为0。自动扩容:当添加元素导致当前容量不足时,
List<T>会自动扩容。扩容时,List<T>会分配一个新的数组,并将现有元素复制到新数组中。扩容倍数:扩容时,新数组的容量通常是旧容量的两倍。这种倍增策略有助于减少频繁分配内存和数据复制的开销。
扩容过程
以下是List<T>扩容的代码示例和详细注释:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 创建一个初始容量为2的List
List<int> numbers = new List<int>(2);
// 添加元素,List会自动扩容
numbers.Add(1);
numbers.Add(2);
// 查看当前容量
Console.WriteLine("容量: " + numbers.Capacity); // 输出: 容量: 2
// 添加第三个元素,触发扩容
numbers.Add(3);
// 查看当前容量
Console.WriteLine("容量: " + numbers.Capacity); // 输出: 容量: 4
// 添加更多元素
numbers.Add(4);
numbers.Add(5);
// 再次查看容量
Console.WriteLine("容量: " + numbers.Capacity); // 输出: 容量: 8
}
}
详细解释
初始容量设置:
- 在创建
List<int>时,可以指定初始容量为2。 List<int> numbers = new List<int>(2);
- 在创建
添加元素:
- 添加第一个和第二个元素时,容量为2,足够存储这些元素。
扩容触发:
- 添加第三个元素时,当前容量已满,触发扩容。
List<T>会分配一个新的数组,容量为旧容量的两倍,即4,并将现有元素复制到新数组中。
继续添加元素:
- 添加第四个和第五个元素,当前容量足够,不需要扩容。
- 当添加第五个元素时,容量达到4,再添加一个元素会再次触发扩容,新的容量为8。
总结
- 初始容量:
List<T>可以指定初始容量。 - 自动扩容:当容量不足时,
List<T>会自动扩容,新容量通常为旧容量的两倍。 - 扩容成本:扩容时需要分配新数组并复制数据,因此频繁扩容会有一定的性能开销。通过合理设置初始容量可以减少扩容次数,提升性能。
5.3 答题示例
“
List<T>底层是动态数组,初始容量可指定或默认为0。每次Add时若容量不足,会新建一个通常为旧容量两倍的数组,将旧元素复制过去,再添加新元素。这样能减少扩容次数,但数组分配和复制都有性能开销,所以可以合理设置初始容量。”
5.4 关键词联想
- 动态数组
- 初始容量
扩容触发 (Add 时容量不足)倍增策略 (旧容量×2)- 数据复制开销
- 预设 Capacity 优化
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com