C#中ArrayList运行机制及其涉及的装箱拆箱

C#中ArrayList运行机制及其涉及的装箱拆箱

    • 1.1 基本用法
      • 1.1.1 属性
      • 1.1.2 方法
    • 1.2 内部实现
    • 1.3 装箱
    • 1.4 拆箱
    • 1.5 object对象的相等性比较
    • 1.6 总结
    • 1.7 其他简单结构类

人物

1.1 基本用法

命名空间: using System.Collections;

1.1.1 属性

Capacity:获取或设置 ArrayList 可包含的元素数目。
Count:获取 ArrayList 中实际包含的元素数目。
Item[Int32]:获取或设置指定索引处的元素。

1.1.2 方法

Add(Object):向 ArrayList 的末尾添加一个元素。
AddRange(ICollection):向 ArrayList 的末尾添加元素集合。
Clear():移除所有元素。
Contains(Object):判断 ArrayList 是否包含特定元素。
IndexOf(Object):返回某个元素在 ArrayList 中的索引。
Insert(Int32, Object):在指定索引位置插入一个元素。
Remove(Object):移除特定元素的第一个匹配项。
RemoveAt(Int32):移除指定索引处的元素。
Sort():对 ArrayList 的元素排序。
ToArray():将 ArrayList 转换为数组。

1.2 内部实现

  • ArrayList 是一个非泛型集合,它可以存储任何类型的对象,本质上是一个object类型的数组;
  • 类似于List,其初始capacity为0,后依次动态扩容为4 8 16 32……;
  • 动态扩容是一项昂贵的操作,因为它涉及到创建新数组和复制元素,需要不断的GC;
  • 如果事先知道大概需要存储的元素数量,预先设置一个合理的容量可以提高性能;
  • 存储值类型元素时:装箱
  • 将值类型元素取出来转换使用时:拆箱
ArrayList array1 = new ArrayList();
WriteLine(array1.Capacity); //输出0(初始容量为0)array1.Add(1);
WriteLine(array1.Capacity); //输出4(首次扩容到4)array1.Add("two");
array1.Add(3);
array1.Add("four");
array1.Add(5);WriteLine(array1.Capacity); //输出8(再次扩容到8)

1.3 装箱

是一个将值类型转换为对象类型的过程,涉及到从栈(值类型通常存储的位置)到堆(引用类型存储的位置)的数据复制。大致步骤:

  • 当发生装箱时,.NET 运行时在堆上为该值类型分配内存。
  • 接着,它将值类型的内容复制到堆上分配的这块内存中。
  • 之后,引用类型变量(例如 object)会指向堆上的这个新位置。

1.4 拆箱

拆箱是将引用类型转换回其原始的值类型的过程。拆箱过程涉及从堆到栈的数据复制。大致步骤:

  • 拆箱操作首先检查引用类型实例是否确实指向先前装箱的值类型。
  • 如果类型匹配,它会从堆上的对象中复制值回栈上的值类型变量。
  • 如果类型不匹配,会抛出 InvalidCastException。

1.5 object对象的相等性比较

== 用于判断两个对象引用是否指向同一个对象实例,即它们在内存中的地址是否相同;
Equals 方法用于比较两个对象的值或内容是否相等。这被称为值相等性。

1.6 总结

装箱和拆箱操作都涉及内存分配和数据复制,这在性能上有一定的成本。特别是在频繁执行这些操作的情况下,性能影响可能更为显著。

由于 ArrayList 是一个非泛型集合,它可以存储任何类型的对象。但这种类型的不确定性会导致运行时错误,并且需要频繁的类型转换。因此,在需要存储不同类型数据的场景中可以使用 ArrayList,但现代的 .NET 开发中,推荐使用泛型集合,如 List< T >,因为它们提供了类型安全和更好的性能。

随着泛型的普及,可以通过使用泛型集合(如 List< T >)来避免许多不必要的装箱和拆箱操作。

1.7 其他简单结构类

ArrayList、Queue、Hashtable等也是类似的:

  • 都位于命名空间:using System.Collections;
  • 内部使用object数组实现,所以元素可以是任意类型。这会导致装箱、拆箱的问题,带来性能开销。
  • 都有对应的更加安全的泛型类,例如Stack< T >、Queue< T >、HashSet< T >。

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

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

相关文章

江苏省力学学会副理事长钱向东、邬萱一行来访天洑软件

近日&#xff0c;江苏省力学学会副理事长钱向东、邬萱率调研组一行来访天洑软件。 会上&#xff0c;双方就平台建设、成果转化、产品研发、品牌宣传、人才培养等方面开展了广泛深入的交流。江苏省力学学会副理事长钱向东、邬萱&#xff0c;分享了学会的平台优势和资源优势以及…

IP地址和端口

1. IP地址&#xff1a; 简介&#xff1a; IP 协议是为计算机网络相互连接进行通信而设计的协议。在因特网中&#xff0c;它是能使连接到网上的所 有计算机网络实现相互通信的一套规则&#xff0c;规定了计算机在因特网上进行通信时应当遵守的规则。任 何厂家生产的计算机系统…

ubuntu20安装网络调试助手遇到缺少qt4相关库的问题

最近需要做套接字通讯的工作&#xff0c;最好是有一个网络调试软件能够接受或者发送套接字&#xff0c;测试代码能够正常通讯。windows下有很多&#xff0c;但是linux下比较少&#xff0c;使用广泛的是下面这一款。 1、安装 首先从网盘&#xff08;链接: https://pan.baidu.c…

dom-to-image-more 使用

与网上不同的使用方式&#xff1a; 官网 dom-to-image-more - npm 这里不会出现两行缩略不行的bug yarn add dom-to-image-more 下面 生成图片并下载图片 const picture ref() const dom2img () > {var node picture.valuedomtoimage.toPng(node, { cacheBust: t…

LabVIEW高级CAN通信系统

LabVIEW高级CAN通信系统 在现代卫星通信和数据处理领域&#xff0c;精确的数据管理和控制系统是至关重要的。设计了一个基于LabVIEW的CAN通信系统&#xff0c;它结合了FPGA技术和LabVIEW软件&#xff0c;主要应用于模拟卫星平台的数据交换。这个系统的设计不仅充分体现了FPGA在…

C# 使用屏障来使多线程并发操作保持同步

写在前面 以下是微软官方对屏障类的介绍&#xff0c;System.Threading.Barrier 可用来作为实现并发同步操作的基本单元&#xff0c;让多个线程(参与者)分阶段并行处理目标算法。在达到代码中的屏障点之前&#xff0c;每个参与者将继续执行&#xff0c;屏障表示工作阶段的末尾&…

微信小程序调取相机实现拍照/录屏

1.效果 2.创建子组件 index.wxml代码 <xr-scene id"xr-scenecameraglb" ar-system bind:ready"handleReady" bind:ar-ready"handleARReady" > <!-- 初始化模型 --><xr-assets bind:loaded"handleAssetsLoaded">…

WhatsApp怎么营销引流?

随着移动互联网的普及&#xff0c;越来越多的企业开始利用社交媒体平台来进行推广和营销。其中&#xff0c;全球最流行的即时通讯软件之一 WhatsApp&#xff0c;为企业提供了一个新的营销渠道。但是&#xff0c;许多企业不知道如何利用 WhatsApp 进行营销引流。今天&#xff0c…

虚拟机网络配置及Moba工具的使用

A、设置IP和网关 1、设置IP [roothadoop00 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 &#xff08;修改如下标红内容&#xff0c;没有的就添加&#xff09; DEVICEeth0 HWADDR08:00:27:BD:9D:B5 #不用改 TYPEEthernet UUID53e4e4b6-9724-43ab-9da7-68792e611031…

不停机迁移,TDengine 在 3D 打印技术中的“焕新”之路

小T导读&#xff1a;自 2021 年我们正式使用 TDengine 至今已接近三年&#xff0c;现在 TDengine 已经成熟应用于我们多个项目当中&#xff0c;凭借着强大的读写存储能力&#xff0c;为我司多项业务的核心数据保驾护航。近期我们团队刚好完成 TDengine 2.x 到 3.x 的数据迁移&a…

VAD语音分割算法详解

1 VAD算法介绍 1.1 语音基本概念 声波通过空气传播&#xff0c;被麦克风接收&#xff0c;通过采样、量化、编码转换为离散的数字信号&#xff0c;即波形文件。音量、音高和音色是声音的基本属性。 采样&#xff1a;原始的语音信号是连续的模拟信号&#xff0c;需要对语音进行…

2024区块链应用趋势,RWA实物资产化

作者 张群&#xff08;赛联区块链教育首席讲师&#xff0c;工信部赛迪特聘资深专家&#xff0c;CSDN认证业界专家&#xff0c;微软认证专家&#xff0c;多家企业区块链产品顾问&#xff09;关注张群&#xff0c;为您提供一站式区块链技术和方案咨询。 实物资产通证化&#xff0…

ffmpeg本地TS和M3U8播放流程及调试过程

本地TS播放过程 本地M3U8播放过程 http工作流程 http分两个步骤 1、获取m3u8文件&#xff0c;这个是在哪里开始读的&#xff1f; 2、获取data数据&#xff0c;这个是从http_read开始读&#xff0c;可以通过修改这里实现buffer数据和引擎对接 3、s->user_agent,s->off,…

Python tkinter (2) —— Button标签

Python的标准Tk GUI工具包的接口 目录 Button 简单示例 设置按钮宽高 设置响应事件 匿名函数调用事件 退出按钮 总结 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Button Button标签在窗口中显示按钮的控件。 简单示例 实现一个…

回归预测 | Matlab基于OOA-SVR鱼鹰算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于OOA-SVR鱼鹰算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于OOA-SVR鱼鹰算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于OOA-SVR鱼鹰算法优化支持向量机的数据…

go语言(十六)----tag

package mainimport ("fmt""reflect" )type resume struct {Name string info:"name" doc:"我的名字"Sex string info:"sex" }func findTag(str interface{}) {t : reflect.TypeOf(str).Elem()for i : 0;i < t.NumField…

前端面试题-js数据类型-怎么判断是对象还是数组-字符串常用方法-数组常用方法

前端面试题-js部分-js数据类型-怎么判断是对象还是数组-字符串常用方法-数组常用方法 JS数据类型有哪些值类型和引用类型的区别数组的常用方法哪些方法会改变原数组 字符串常用方法对象常用方法怎么判断是对象还是数组 JS数据类型有哪些 数据类型类型描述Number基本类型&#…

Day24_77 组合

77 组合 组合无序&#xff0c;排列有序。1~n个数中选k个数组合&#xff0c;k不确定&#xff0c;组合的方式。 &#xff08;图片来自代码随想录&#xff09;确定回溯法的三部曲&#xff1a; 递归函数的返回值和参数&#xff1a;集合n中取k个数&#xff0c;&#xff0c;每次从…

实用VBA:17.大量word文件中的文本内容进行批量替换

1.需求场景 在工作中可能会遇到需要对大量word文件中的文字内容进行批量替换的情况。相比excel的批量处理&#xff0c;个人感觉word文档中由于包含大量样式信息&#xff0c;批处理时总感觉有顾虑。一者担心影响了文档的格式&#xff0c;误修改了文档的样式&#xff0c;那后果……

【操作系统】实验五 添加内核模块

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…