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.hqwc.cn/news/419211.html

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

相关文章

Broadcom交换芯片56620架构

文章目录 架构1.系统逻辑视图2.逻辑芯片视图3.芯片框图4.MIIM&#xff08;Medium Independent Interface Management&#xff09;5.交换结构6.CAP 架构 1.系统逻辑视图 Ingress Chip作用&#xff1a; 解析报文128字节的头部&#xff08;MMU&#xff08;Memory Management Uni…

将字符串中可能被视为正则表达式的特殊字符进行转义re.escape()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将字符串中可能被视为 正则表达式的特殊字符 进行转义 re.escape() [太阳]选择题 请问以下代码最后输出的结果是&#xff1f; import re s [a-z] print("【显示】s ",s) print(&q…

C语言练习day8

变种水仙花 变种水仙花_牛客题霸_牛客网 题目&#xff1a; 思路&#xff1a;我们拿到题目的第一步可以先看一看题目给的例子&#xff0c;1461这个数被从中间拆成了两部分&#xff1a;1和461&#xff0c;14和61&#xff0c;146和1&#xff0c;不知道看到这大家有没有觉得很熟…

【Java】HttpServlet类简单方法和请求显示

1、HttpServlet类简介&#x1f340; Servlet类中常见的三个类有&#xff1a;☑️HttpServlet类&#xff0c;☑️HttpServletRequest类&#xff0c;☑️HttpResponse类 &#x1f42c;其中&#xff0c;HttpServlet首先必须读取Http请求的内容。Servlet容器负责创建HttpServlet对…

力扣刷MySQL-第五弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

【JavaEE】_网络编程基础

目录 1. 网络编程基础 1.1 网络编程定义 1.2 网络编程中的基本概念 1.2.1 API 1.2.2.发送端和接收端 1.2.3 请求和响应 1.2.4 客户端和服务端 2. Socket 套接字 2.1 概念 2.2 分类 3. UDP数据报套接字编程 3.1 DatagramSocket API 3.1.1 含义 3.1.2 构造方法 3…

C语言第一弹---C语言基本概念(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 C语言基本概念 1、C语言是什么&#xff1f;2、C语言的历史和辉煌3、编译器的选择VS20223.1、编译和链接3.2、编译器对比3.3、VS2022优缺点 4、VS项目和源文件、头…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (四)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;四&#xff09; 一、理论1.1 理论研读1.2 什么是AI Agent? 二、实战2.1 先导知识2.1.1 tensor的创建与使用2.1.2 PyTorch的模块2.1.2.1 torch.nn.Module类的继承与使用2.1.2.2 torch.nn.Linear类 2.2 Transformer代…

LSTM学习笔记

上一篇文章中我们提到&#xff0c;CRNN模型中用于预测特征序列上下文的模块为双向LSTM模块&#xff0c;本篇中就来针对该模块的结构和实现做一些理解。 Bidirectional LSTM模块结构如下图所示&#xff1a; 在Pytorch中&#xff0c;已经集成了LSTM模块&#xff0c;定义如下&…

Python 自动化测试:数据驱动

软件质量。这种测试&#xff0c;在功能测试中非常耗费人力物力&#xff0c;但是在自动化中&#xff0c;却比较好实现&#xff0c;只要实现了测试操作步骤&#xff0c;然后将多组测试数据以数据驱动的形式注入&#xff0c;就可以实现了。 前面文章学习了参数化&#xff0c;当数…

关于常见分布式组件高可用设计原理的理解和思考

文章目录 1. 数据存储场景和存储策略1.1 镜像模式-小规模数据1.2 分片模式-大规模数据 2. 数据一致性和高可用问题2.1 镜像模式如何保证数据一致性2.2 镜像模式如何保证数据高可用2.2.1 HA模式2.2.2 分布式选主模式 2.3 分片模式如何数据一致性和高可用 3. 大规模数据集群的架构…

电子学会C/C++编程等级考试2023年12月(八级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:生理周期 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集…