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

在 C# 中,List<T>是一个动态数组,它会根据需要自动调整其容量以容纳更多的元素。

目录

[1 扩容条件与扩容算法规则](#1 扩容条件与扩容算法规则)

[2 总结](#2 总结)


1 扩容条件与扩容算法规则

当你创建一个新的List<T>实例时,如果没有指定初始容量,它会使用默认的初始容量,这个默认值通常是 0 。当你第一次添加元素时,List<T> 会将容量初始化为一个预设的值,在 .NET 中,这个预设值是 4。

cs 复制代码
        List<int> list = new List<int>();
        Console.WriteLine($"初始容量: {list.Capacity}"); // 输出: 0
        list.Add(1);
        Console.WriteLine($"添加一个元素后的容量: {list.Capacity}"); // 输出: 4

当你向List<T>之中添加元素,并且超过了他的容量的时候,List就会自动扩容。

List扩容算法是将当前容量乘以 2 (在某些早期版本的 .NET 中可能会有不同的实现,但大多数情况下是乘以 2 )。例如,如果当前容量是 4,当需要扩容时,新的容量会变为 8;如果当前容量是 8,新的容量会变为 16,依此类推。

我们举个例子:

cs 复制代码
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> list = new List<int>();
        for (int i = 0; i < 30; i++)
        {
            list.Add(i);
            Console.WriteLine($"添加元素 {i} 后,元素数量: {list.Count}, 容量: {list.Capacity}");
        }
    }
}

为了避免频繁的扩容操作带来的性能开销,你可以在创建List<T>实例时手动指定初始容量。例如:

cs 复制代码
        public static void Main(string[] args)
        {
            // 指定初始容量为 20
            List<int> list = new List<int>(20); 
            Console.WriteLine($"初始容量: {list.Capacity}"); // 输出: 20
        }

2 总结

List<T>的扩容机制是自动且动态的,当元素数量超过当前容量时,会将容量扩大为原来的 2 倍。扩容过程涉及到新数组的分配、元素的复制和原数组的释放,可能会带来一定的性能开销。因此,在已知元素数量大致范围的情况下,手动指定初始容量可以提高性能。扩容过程主要包含以下几个步骤:

  • 分配新数组 :根据新的容量在内存中分配一个更大的数组。
  • 复制元素 :将原数组中的所有元素复制到新数组中。
  • 释放原数组 :原数组的内存会被释放,由垃圾回收器进行处理。
  • 更新引用:List<T> 内部会更新其对数组的引用,指向新分配的数组。
相关推荐
gCode Teacher 格码致知3 分钟前
Javascript提高:get和post等请求,对于汉字和空格信息进行编码的原则-由Deepseek产生
开发语言·前端·javascript·node.js·jquery
黑眼圈子5 分钟前
总结一下用Java做算法的常用类和方法
java·开发语言·算法
码界筑梦坊16 分钟前
353-基于Python的大湾区气候数据可视化分析系统
开发语言·python·信息可视化·数据分析·django·vue·毕业设计
NAGNIP35 分钟前
一文搞懂CNN经典架构-EfficientNet!
算法·面试
Giant1001 小时前
🔥前端跨域封神解法:Vite Proxy + Express CORS,一篇搞定所有跨域坑!
前端·javascript·面试
c++逐梦人1 小时前
C++11——— 包装器
开发语言·c++
zihao_tom1 小时前
Go环境搭建(vscode调试)
开发语言·vscode·golang
武藤一雄1 小时前
C# 设计模式大全(第一弹|7种)
microsoft·设计模式·微软·c#·.net·.netcore
Lazy_zheng1 小时前
Map / Set / WeakMap / WeakSet,一次给你讲透
前端·javascript·面试
IT方大同1 小时前
(实时操作系统)线程管理
c语言·开发语言·嵌入式硬件