5.C#中的List如何扩容

  1. 5.CSharp中的List如何扩容
    1. 5.1 题目
    2. 5.2 深入解析
      1. 扩容机制
      2. 扩容过程
      3. 详细解释
      4. 总结
    3. 5.3 答题示例
    4. 5.4 关键词联想

5.CSharp中的List如何扩容


5.1 题目

说明C#中的List是如何扩容的?


5.2 深入解析

在C#中,List<T> 是一个动态数组,其容量可以根据需要动态扩展。了解List<T>的扩容机制有助于更好地管理内存和优化性能。下面是关于List<T>扩容的详细说明。

扩容机制

当向List<T>中添加元素且容量不足时,List<T>会自动扩容。具体的扩容机制如下:

  1. 初始容量List<T>在创建时可以指定初始容量(capacity),如果没有指定,则初始容量默认为0。

  2. 自动扩容:当添加元素导致当前容量不足时,List<T>会自动扩容。扩容时,List<T>会分配一个新的数组,并将现有元素复制到新数组中。

  3. 扩容倍数:扩容时,新数组的容量通常是旧容量的两倍。这种倍增策略有助于减少频繁分配内存和数据复制的开销。

扩容过程

以下是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
    }
}

详细解释

  1. 初始容量设置

    • 在创建List<int>时,可以指定初始容量为2。
    • List<int> numbers = new List<int>(2);
  2. 添加元素

    • 添加第一个和第二个元素时,容量为2,足够存储这些元素。
  3. 扩容触发

    • 添加第三个元素时,当前容量已满,触发扩容。
    • List<T>会分配一个新的数组,容量为旧容量的两倍,即4,并将现有元素复制到新数组中。
  4. 继续添加元素

    • 添加第四个和第五个元素,当前容量足够,不需要扩容。
    • 当添加第五个元素时,容量达到4,再添加一个元素会再次触发扩容,新的容量为8。

总结

  • 初始容量List<T>可以指定初始容量。
  • 自动扩容:当容量不足时,List<T>会自动扩容,新容量通常为旧容量的两倍。
  • 扩容成本:扩容时需要分配新数组并复制数据,因此频繁扩容会有一定的性能开销。通过合理设置初始容量可以减少扩容次数,提升性能。

5.3 答题示例

List<T> 底层是动态数组,初始容量可指定或默认为0。每次 Add 时若容量不足,会新建一个通常为旧容量两倍的数组,将旧元素复制过去,再添加新元素。这样能减少扩容次数,但数组分配和复制都有性能开销,所以可以合理设置初始容量。”


5.4 关键词联想

  • 动态数组
  • 初始容量
  • 扩容触发 (Add 时容量不足)
  • 倍增策略 (旧容量×2)
  • 数据复制开销
  • 预设 Capacity 优化


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏