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

news/2025/2/23 7:33:11

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

目录

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

 2  总结


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

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

        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,依此类推。

我们举个例子:

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>实例时手动指定初始容量。例如:

        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>内部会更新其对数组的引用,指向新分配的数组

http://www.niftyadmin.cn/n/5863173.html

相关文章

小智机器人CMakeLists编译文件解析

编译完成后&#xff0c;成功烧录&#xff01; 这段代码是一个CMake脚本&#xff0c;用于配置和构建一个嵌入式项目&#xff0c;特别是针对ESP32系列芯片的项目。CMake是一个跨平台的构建系统&#xff0c;用于管理项目的编译过程。 set(SOURCES "audio_codecs/audio_code…

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者&#xff1a;飞天大河豚 引言 2025年的前端开发领域&#xff0c;Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化&#xff0c;两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…

【C语言】第六期——数组

目录 0 前言 1 声明数组 2 初始化数组 2.1 部分初始化 3 访问数组元素 4 修改数组元素 5 计算数组长度&#xff08;size of&#xff09; 5.1 应用&#xff1a;遍历数组 6 定义使用数组时常见的错误 7 选择排序和冒泡排序&#xff08;拓展&#xff09; 7.1 选择排序 …

ChromeDriver版本不匹配问题的解决

今天运行一个以前写的爬虫程序&#xff0c;遇到如下错误&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 121 Current browser version is 133.0.6943.98 w…

计算机毕业设计SpringBoot+Vue.js学生读书笔记共享(源码+LW文档+PPT+讲解+开题报告)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

车载诊断数据库 --- AUTOSAR诊断文件DEXT简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Mac下常用命令

Mac下常用命令 查看端口和杀死进程 查看端口和杀死进程 查看端口 lsof -i :端口号杀死进程 kill pid

RT-Thread+STM32L475VET6——USB鼠标模拟

文章目录 前言一、板载资源二、具体步骤1.配置icm20608传感器2.打开CubeMX进行USB配置3. 配置USB3.1 打开USB驱动3.2 声明USB3.3 剪切stm32xxxx_hal_msp.c中的void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd)和void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd)函数至board.c3.…