【源码探索】.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;虚拟技术的实现是在…

服务器环境

一 linux 系统搭建Java项目环境 1 环境准备&#xff1a;jdk,tomcat, nginx,reids,mysql jdk:java环境 Tomcat&#xff1a;Java项目服务器 nginx&#xff1a;项目静态资源&#xff0c;域名解析&#xff08;ssl&#xff09; redis: 项目可能会用到 mysql: 数据库 环境转载于:htt…

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

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;取代。这些服务器一般采用通…

【智力大冲浪】

【智力大冲浪】riddle内存限制&#xff1a; 128M【题目描述】例 1 智力大冲浪&#xff08;riddle.pas&#xff09;。【题目描述】小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者&#xff0c;主持人为了表彰大家的勇气&#xff0c;先奖励每个参赛者 m 元。…

调试 不弹出 小米_时隔六年,小米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…

高并发下防止库存超卖解决方案

一、概述 目前网上关于防止库存超卖&#xff0c;我没找到可以支持一次购买多件的&#xff0c;都是基于一次只能购买一件做的秒杀方案&#xff0c;但是实际场景中&#xff0c;一般秒杀活动都是支持&#xff11;&#xff5e;&#xff15;件的&#xff0c;因此为了补缺&#xff0…

【几何/分治】【最短路】【数学期望】Day 10.24

1、斜率 可以证明如果两点之间还有一点的话那么原来的两个点连线一定不会是最大斜率 然后我就写了个沙茶分治………… 其实根据上面的推论只用枚举相邻的两个点&#xff0c;扫一遍就可以了 1 #include <cstdio>2 #include <algorithm>3 #include <iostream>4…

K8s 介绍

过去一段时间&#xff0c;公司事情比较多&#xff0c;现在稍微能好点&#xff0c;今天进一步验证自己K8S 集群环境&#xff0c;遇到不少问题&#xff0c; 发现从自己的master 上无法访问node 的pod&#xff0c; 然后一堆search 。 config 。。 [rootk8s-master ~]# systemctl s…

easypoi needmerge失效_EasyPOI简单用例,简单有效

用poi导出Excel表格&#xff0c;需要配置很多东西&#xff0c;也比较麻烦&#xff0c;这里使用poi的封装easypoi&#xff0c;可以快速配置&#xff0c;实现Excel或者word文件的导出。这里我们结合SpringMVC开发easypoi。1&#xff0c;导入以下3个.jar包:这里是springMVC和easyp…

禁止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 文件夹的共享目录。 我们最终想…

jsp编程技术徐天凤课后答案_jsp编程技术教材课后习题.doc

jsp编程技术教材课后习题JSP编程技术习题集1.6 本 章 习 题思考题(1)为什么要为JDK设置环境变量&#xff1f;(2)Tomcat和JDK是什么关系&#xff1f;(3)什么是Web服务根目录、子目录、相对目录&#xff1f;如何配置虚拟目录&#xff1f;(4)什么是B/S模式&#xff1f;(5)JSP、Jav…

JVM知识(一)

java三大流&#xff1a;数据流、控制流、指令流 线程是执行程序的最小单元&#xff0c;一个线程中也有这些东西。 java 运行时数据区&#xff1a; 1.程序计数器 指向当前线程正在执行的字节码指令地址。如果此时从一个线程转为执行另一个线程&#xff0c;此时就会中断&#xff…

AWD-LSTM为什么这么棒?

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