【源码探索】.NET中的List,是哪种数据结构

当你提出疑问并开始思考时,答案就离你不远了

13761587eb6f81fe4bd6cb3fb2655441.jpeg

@图片:奥森公园的向日葵 拍摄于2022年7月23日 @摄影师:刘先生

01

问题缘起

严格来说应该是List<T>,因为.NET的核心基础类库中,并没有List,作为泛型类型的List<T>,对应的非泛型类型是ArrayList。

那么小伙伴们是否清楚,List<T>是哪种数据结构呢?

List被称作“列表”,相信大家对于"队列"和"链表"都很熟悉,但是"列表"似乎有些陌生,课本教材中将广义表称为列表,这个广义表的定义是:一个多层次的数据结构。直白的说就是表中的元素类型可以不同,这显然不是.NET中List<T>。

微软文档的定义是:

List<T> :表示可通过索引访问的对象的强类型列表。

这显然也没有解答我们问题。

程序世界没有秘密,一切答案都藏在代码里。

扒出List<T>的源码,我们一起看一下吧。【文末附源码】

02


初识List

List<T>的源码如下:

16b973c88e3cb1d0a454ae6bf03ef0c1.png

从源码及注释中可知:List<T>是基于数组实现的可扩容的列表。

看一下这几个私有变量:

T[] _items:是实际的存储类型,默认构造函数,将_items赋值为一个空数组。

int _size:记录当前列表中的元素数量。

int _version:这个有意思,我们知道,在遍历列表过程中,不能对列表进行修改,这个功能便是通过_version实现的,当列表中的元素修改后,_version值会改变,列表遍历过程中对其进行判断,进而引发异常,中断操作。

03


List如何扩容

那列表是如何实现数组长度变化的呢?下面3个方法给了我们答案。

1d3d40fef6debe6308a09dcbf9f06a05.png

从源码可知,私有变量_size记录了列表中实际的元素数量,当调用Add(T item)添加元素时,会将_size与_item.Length进行对比,判断当前数组是否已满,首次添加元素时,分配的数组默认长度为4,否则重新分配一个2倍长度的数组,然后将原先的元素拷贝到新数组中,实现数组的自动扩容。

04


List使用小技巧

1.在已知数据长度的情况下,初始化时,应指定初始长度。

以添加100个元素为例,全部Add(T item)进列表,需要6次数组扩容和数据拷贝,显然,已知数据的长度的情况下,应该在创建List对象时,指定初始长度,以减少数组的重写分配和数据拷贝。

2.另一种扩容方法是:设置Capacity属性,但需要注意,设置的值不能小于当前列表的元素数量,否则会抛异常。

3.在.NET 6中,新增了一个方法public int EnsureCapacity(int capacity),推荐调用这个方法进行列表扩容,只要参数capacity不小于0,方法就不会报错。

7a0223a59c81a6fdde178f55d16c92fc.pngda7fa15de4b3f2471edb46b8ae7dab15.png

05


总结

结论:List<T>是以数组为底层数据结构,实现的可扩容的列表,并且提供了查找,转换,排序,遍历,顺序逆转等便捷的方法。

List<T>中既有Count属性,又有Count()方法,小伙伴们知道为什么吗?我们下期再聊。

说明:文中源码基于.NET 6.0版本,在整理文章内容的过程中,还参考对比了.NET Framework 4.8 、.NET 5.0 几个不同版本的代码,不同版本间略有异。

文档参考:List<T>文档地址 

源码链接:List<T>源码地址

喜欢的朋友可以点赞,转发,加关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dpdk对虚拟化的支持调研

目录&#xff1a; 虚拟化dpdk的实现研究 virtiovhostSR-IOV热迁移相关研究拓展本文记录近期对dpdk在虚拟化和云计算领域应用的研究成果&#xff0c;内容梳理如下。 虚拟化 虚拟化&#xff0c;抽象来说&#xff0c;就是将物理资源逻辑化。具体来说&#xff0c;虚拟技术的实现是在…

隐藏键盘_三星新专利:带有隐藏键盘的三折叠屏手机

10月31日消息 众所周知&#xff0c;三星现已推出四款折叠屏机型(Fold、Fold 2、Z Flip、W20)&#xff0c;而此前多有传言表示三星下一代折叠屏机型(以 Galaxy Z Fold 3 代称)将在目前折叠屏手机的基础上增加 S Pen&#xff0c;而昨日公布的一份专利也侧面辅证了这一说法。此外&…

Blazor学习之旅(3)实现一个Todo应用

【Blazor】| 总结/Edison Zhou大家好&#xff0c;我是Edison。最近在学习Blazor做全栈开发&#xff0c;因此根据老习惯&#xff0c;我会将我的学习过程记录下来&#xff0c;一来体系化整理&#xff0c;二来作为笔记供将来翻看。本篇&#xff0c;我们通过一个简单的Todo示例应用…

JavaScript 省市级联效果

为什么80%的码农都做不了架构师&#xff1f;>>> JavaScript 省市级联效果 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2 <html xmlns"http…

20分钟完成Mac上的 LNMP 环境部署,优雅·高效开发(Docker方式)

一、前言 对于很多开发者来说&#xff0c;突然转到在 mac 系统开发&#xff0c;可能会非常难受&#xff0c;主要有以下几个原因 1、mac 上安装软件程序坑多&#xff0c;比如安装 PHP、Nginx&#xff0c;会存在很多使用 linux 或 windows 时没有遇到过的坑 2、对 mac 系统不熟…

可编程交换时代就在这里

在第一批网络处理器推出20年后&#xff0c;我们正在向完全可编程数据平面迈进&#xff0c;网络运营商在虚拟化方面的努力推动了这一趋势的发展。 大多数物理网络系统正在被运行在网络核心和边缘的服务器上的虚拟网络功能&#xff08;VNF&#xff09;取代。这些服务器一般采用通…

调试 不弹出 小米_时隔六年,小米NFC碰碰贴复活,碰一下自动亮灯、联网、投屏...

有朋友问我&#xff0c;NFC除了刷门禁、刷公交、离线支付外&#xff0c;还能干什么&#xff1f;实际上NFC的应用场景远不止于此&#xff0c;今天就带大家开开眼界。今年是小米十周年&#xff0c;各种酷玩新品不断&#xff0c;其中“小米碰碰贴2”就是一款便宜又好玩的产品。小米…

微信小程序把玩(三)tabBar底部导航

为什么80%的码农都做不了架构师&#xff1f;>>> tabBar相对而言用的还是比较多的&#xff0c;但是用起来并没有难&#xff0c;在app.json中配置下tabBar即可&#xff0c;注意tabBar至少需要两个最多五个Item选项 主要属性&#xff1a; 对于tabBar整体属性设置&…

WPF 之列表分页控件

WPF 之列表分页控件控件名&#xff1a;WindowAcrylicBlur作者&#xff1a; WPFDevelopersOrg - 黄佳 | 驚鏵原文链接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。新建Paginat…

禁止sethc.exe运行 防止3389的sethc后门

废话&#xff1a;在土司看到的一篇文章,发私信给那个哥们儿说让不让转载,结果还没回复我就在百度看到相同的文章。他自己也是转载的。这哥们儿ID迟早被ban 文章转载自:http://www.jb51.net/hack/64484.html 点“开始”&#xff0c;在“运行”中敲入gpedit.msc依次展开“用户配置…

Mac 与虚拟机中的linux集群共享文件目录设置

一、环境介绍 本机&#xff1a;Macos Big Sur系统 虚拟机软件&#xff1a;vmware-fusion 虚拟机上虚拟的linux - centos7 系统 二、实现的效果 在mac上创建一个/Users/SH-Server/vm-vagrant目录&#xff0c;作为之后和虚拟机linux系统 /data 文件夹的共享目录。 我们最终想…

AWD-LSTM为什么这么棒?

摘要&#xff1a; AWD-LSTM为什么这么棒&#xff0c;看完你就明白啦&#xff01;AWD-LSTM是目前最优秀的语言模型之一。在众多的顶会论文中&#xff0c;对字级模型的研究都采用了AWD-LSTMs&#xff0c;并且它在字符级模型中的表现也同样出色。 本文回顾了论文——Regularizing …

Mac上,为虚拟机集群上的每台虚拟机设置固定IP

一、环境介绍 本机&#xff1a;macOS系统 虚拟机软件&#xff1a;VMware Fusion 虚拟机上&#xff1a;centos7内核的Linux系统集群 二、为什么要为每台虚拟机设置固定ip 由于每次启动虚拟机&#xff0c;得到的ip可能不一样&#xff0c;这样对远程连接非常不友好&#xff0c…

记一次某制造业ERP系统 CPU打爆事故分析

一&#xff1a;背景 1.讲故事前些天有位朋友微信找到我&#xff0c;说他的程序出现了CPU阶段性爆高&#xff0c;过了一会就下去了&#xff0c;咨询下这个爆高阶段程序内部到底发生了什么&#xff1f;画个图大概是下面这样&#xff0c;你懂的。按经验来说&#xff0c;这种情况一…

PC端和移动APP端CSS样式初始化

CSS样式初始化分为PC端和移动APP端 1.PC端&#xff1a;使用Normalize.css Normalize.css是一种CSS reset的替代方案。 我们创造normalize.css有下面这几个目的&#xff1a; 保护有用的浏览器默认样式而不是完全去掉它们一般化的样式&#xff1a;为大部分HTML元素提供修复浏览器…

框架实现修改功能的原理_JAVA集合框架的特点及实现原理简介

1.集合框架总体架构集合大致分为Set、List、Queue、Map四种体系,其中List,Set,Queue继承自Collection接口&#xff0c;Map为独立接口Set的实现类有:HashSet&#xff0c;LinkedHashSet&#xff0c;TreeSet...List下有ArrayList&#xff0c;Vector&#xff0c;LinkedList...Map下…

NPM报错终极大法

2019独角兽企业重金招聘Python工程师标准>>> 所有的错误基本上都跟node的版本相关 直接删除系统中的node 重新安装 sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*} 重新安装 $ n lts $ npm install -g npm $ n stable…

10.python网络编程(socket server 实现并发 part 2)

一、基于tcp的socket通信的基本原理分析。基于tcp的socket通信&#xff0c;主要依靠两个循环&#xff0c;分别是连接循环和通信循环。这个前面的文章有写过&#xff0c;在这里就不再重复了。二、socketserver实现多并发的原理分析。1.server类&#xff1a;2.reques类。类继承关…

如何在一小时内更新100篇文章?-Evernote Sync插件介绍

上一篇“手把手教你制作微信小程序&#xff0c;开源、免费、快速搞定”&#xff0c;已经教会你如何快速制作一个小程序&#xff0c;但作为资讯类小程序&#xff0c;内容不可少&#xff0c;并且还需要及时更新。 但是&#xff0c;如果让你复制粘贴&#xff0c;可能还需要上传图片…

iOS无线真机调试

为什么80%的码农都做不了架构师&#xff1f;>>> Xcode从9开始 就支持无线真机调试&#xff0c;那么怎么操作呢&#xff1f; 首先用数据线连接你的设备&#xff0c;接下来Xcode- Window-Devices and Simulators 点开之后看到你的设备 默认情况下Connect via networ…