news 2026/6/26 3:19:09

List 为什么选择 2 倍扩容?从动态数组到摊还分析彻底理解扩容策略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
List 为什么选择 2 倍扩容?从动态数组到摊还分析彻底理解扩容策略

一、引言:一个看似简单的问题

1.1 每天都在用的 List

C# 开发者的日常几乎离不开List<T>。我们随手就能写出这样的代码:

List<int>nums=new();for(inti=0;i<1000000;i++){nums.Add(i);}

这段代码运行流畅,毫无停顿,但如果我们停下来想一想,会发现它背后藏着一些值得深挖的问题:

  • 数组长度不是固定的吗?
  • List<T>为什么能够看似无限增长?
  • Add方法的时间复杂度为什么被认为是 O(1)?
  • 为什么扩容选择 2 倍,而不是 1.5 倍或 3 倍?

这些问题的答案,正好反映了高级语言集合类在现代工程中的精巧设计。

1.2 一个优秀容器背后的工程权衡

本文将从以下几个角度展开:

  • 动态数组的内部原理
  • 数学推导与等比数列
  • 摊还分析(Amortized Analysis,如哈希表冲突解决、动态数组扩容均依赖此方法)
  • CLR 内存模型与 GC
  • 不同语言的扩容策略对比

最终,我们将彻底解释为什么List<T>最终选择了 2 倍扩容策略


二、List 的本质:动态数组

2.1 List 的内部结构

List<T>的核心数据结构非常简洁,本质上就是对一个数组的封装:

privateT[]_items;// 存放数据的内部数组privateint_size;// 实际元素个数
  • _items负责存储所有元素,其长度就是当前容量(Capacity)
  • _size记录当前实际存储的元素数量,它一定小于或等于容量。

可以这样理解:

List<T> 本质上就是 T[] 的高级封装

2.2 数组为什么无法扩容

连续内存布局

数组元素在内存中是连续存放的,例如一个包含 4 个 int 的数组:

┌────┬────┬────┬────┐ │ 10 │ 20 │ 30 │ 40 │ └────┴────┴────┴────┘

这种连续布局带来了巨大的性能优势:

  • 缓存友好(Cache Friendly):由于 CPU 以缓存行(Cache Line,通常为 64 字节)为单位加载数据,连续内存意味着一次加载就能将多个相邻元素拉入缓存,完美契合局部性原则。
  • 可能触发 CPU 预取(Prefetch):因内存连续,硬件预取器能够提前猜测访问模式并将后续数据加载到缓存中。
  • O(1) 随机访问:通过基地址加偏移量立即定位任意元素。
长度在创建时即确定

当我们在 C# 中创建一个数组:

vararr=newint[4];

CLR 在堆上分配的内存结构大致为:

[对象头] + [数组长度] + [元素存储区]

一旦分配完成,长度字段就是不可变的。假设我们想把这个数组的容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 3:14:40

Windows 12网页版:终极在线体验完整指南

Windows 12网页版&#xff1a;终极在线体验完整指南 【免费下载链接】win12 Windows 12 网页版&#xff0c;在线体验 点击下面的链接在线体验 项目地址: https://gitcode.com/gh_mirrors/wi/win12 想要零安装体验最新Windows 12界面吗&#xff1f;Windows 12网页版为你提…

作者头像 李华
网站建设 2026/6/26 3:07:33

模型压缩技术:剪枝、量化与知识蒸馏的方法

模型压缩技术&#xff1a;剪枝、量化与知识蒸馏的方法 随着深度学习模型的规模不断扩大&#xff0c;其在计算资源、存储空间和推理速度上的需求也日益增长。模型压缩技术应运而生&#xff0c;旨在减小模型体积、提升推理效率&#xff0c;同时尽可能保持模型性能。剪枝、量化与…

作者头像 李华
网站建设 2026/6/26 3:05:22

原神自动化助手终极指南:5大核心功能解放你的游戏时间

原神自动化助手终极指南&#xff1a;5大核心功能解放你的游戏时间 【免费下载链接】genshin_impact_assistant 原神小助手 Genshin Assistant (CN/EN) | 自动战斗,秘境,领日常,半自动委托 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin_impact_assistant 你…

作者头像 李华
网站建设 2026/6/26 2:55:36

MacBook Air M2本地部署DeepSeek-Coder实战指南

1. 项目概述&#xff1a;当本地AI编程助手第一次在我笔记本上跑起来时&#xff0c;我关掉了所有浏览器标签页“Is AI coding that good?”——这个标题不是在问技术指标&#xff0c;而是在问一个程序员每天早上打开IDE时的真实心跳。我试过用DeepSeek-Coder在VS Code里写爬虫&…

作者头像 李华
网站建设 2026/6/26 2:54:09

NSK大跨距极速精密滚珠丝杠技术解析

型号 PSS2030N1D0708 同样属于 sources 中 NSK 专为主打微型、高速、静音与紧凑&#xff08;小型化&#xff09;**紧凑型 FA 系列&#xff08;PSS 型&#xff0c;高精度 C5 级&#xff09;滚珠丝杠&#xff0c;采用高响应的端部导流循环方式**。 | 编码 | 属性 | 数据 | 内容…

作者头像 李华