当前位置: 首页 > news >正文

【Unity C#基础】浅谈List底层逻辑

1.内部实现

List实际是通过数组来实现的,而不是链表。并且没设定初始容量的情况下,初始容量默认为0。

2.扩容

每次容量不够时,数组容量会扩充一倍。按照4、8、16、32、64、128、256……递增。

按照2的指数进行扩容可以为GC减少负担。

每次扩容时,都会new一个新的数组,并抛弃旧数组,造成内存垃圾,为GC带来负担。

因此我们最好可以在创建List时,指定一个数组范围,避免扩容所带来的GC消耗。

3.Add、Remove、Insert

Add:会检测List容量是否需要扩容,并为对应的数组元素赋值。

Remove:通过IndexOf找到元素标号,在调用RemoveAt,通过标号删除元素。
删除过程实际上是通过Array.Copy对数组进行覆盖。

Insert:同Add一样,检测是否需要扩容,再通过复制数组的形式,将标号之后的元素都向后移动一个位置。

4.其它接口

(1)[]:直接使用数组索引方式调用。
(2)Clear:不删除数组,只对数组中元素设置0或者Null,并设置表示size的参数为0。
(3)Constant:for循环线性查找。
(4)ToArray:创建一个新数组,用于复制后的返回结果。频繁使用会会造成大量的内存分配。
(5)Find:for循环的线性查找。
(6)Enumerator:.Net4.0之前会产生大量的垃圾对象(Enumerator实例),4.0之后已修复此问题。
(7)Sort:使用快速排序进行排序,时间复杂度为O(nlgn)。

5.总结

List的效率不高,只是实用性强,可以对线性算法和内存分配方式进行优化。
在使用时尽量避免扩容等操作,频繁创建数组。
并且List时线程不安全的,在多线程中使用要加锁。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • npm相关指令
  • 现场可重构CPLD芯片应用案例—蓝牙音箱
  • PHP 与 1688 详情 API 接口的完美对接
  • UE4-初见虚幻引擎
  • java包装类 及其缓存
  • 浏览器的缓存
  • PyCharm软件初始化配置
  • 使用 Flask 3 搭建问答平台(三):注册页面模板渲染
  • 华为OD机考题(基础API)
  • 【Linux】服务器安装SSH
  • 人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解
  • 通过docker构建基于LNMP的WordPress项目
  • 微信小程序基本语法
  • WPF实现一个带旋转动画的菜单栏
  • js | 原型链
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【知识碎片】第三方登录弹窗效果
  • Angular 2 DI - IoC DI - 1
  • JavaScript实现分页效果
  • JavaScript新鲜事·第5期
  • Nacos系列:Nacos的Java SDK使用
  • node-glob通配符
  • Vue 重置组件到初始状态
  • Vue组件定义
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 聊聊flink的BlobWriter
  • 使用 QuickBI 搭建酷炫可视化分析
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 整理一些计算机基础知识!
  • ​Java并发新构件之Exchanger
  • ​字​节​一​面​
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (19)夹钳(用于送货)
  • (7)摄像机和云台
  • (9)目标检测_SSD的原理
  • (pojstep1.1.2)2654(直叙式模拟)
  • (搬运以学习)flask 上下文的实现
  • (层次遍历)104. 二叉树的最大深度
  • (二)springcloud实战之config配置中心
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (转) Android中ViewStub组件使用
  • (转)IOS中获取各种文件的目录路径的方法
  • .chm格式文件如何阅读
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET6实现破解Modbus poll点表配置文件
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @Bean, @Component, @Configuration简析
  • [ C++ ] STL---stack与queue