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

手动实现C#ArrayList容器

using System;
using System.Collections;
using System.Text;namespace CSharp进阶
{class ArrayList<T>{private T[] array;private int count;public ArrayList(){count = 0;array = new T[16];}public void Add(T value){//先判断是否需要扩容if(count >=Capcity){//先搬家T[] temp = new T[Capcity * 2];for (int i = 0; i < Capcity ; i++){temp[i] = array[i];}//重新指明方向array = temp;}//不需要扩容,直接加array[count] = value;++count;}public void Remove(T value){int index = -1;//先判断要删的是否存在for (int i = 0; i < Count ; i++){if(array[i] .Equals(value)){//存在index = i;break;}}if(index!=-1){RemoveAt(index);}}public void RemoveAt(int index){//判断索引是否合法if(index<0||index>=Count ){Console.WriteLine("索引不合法");return;}//索引合法for (; index < Count - 1; index++){array[index] = array[index + 1];}array[Count - 1] = default(T);--count;}public int Capcity{get{return array.Length;}}public int Count{get{return count;}}public T this[int index]{get{if (index < 0 || index >= Count){Console.WriteLine("索引不合法");return default (T);}return array[index];}set{if (index < 0 || index >= Count){Console.WriteLine("索引不合法");return;}array[index] = value;}}}class Program{static void Main(string[] args){}}
}

这段代码实现了一个泛型动态数组类ArrayList<T>,它模拟System.Collections.Generic.List<T>的基本功能

  • 泛型设计:使用<T>支持任意类型
  • 底层结构:基于固定大小数组实现动态扩容
  • 容量管理:通过countarray.Length分离实际元素数和总容量

Add方法:

  • 自动扩容机制:当元素数量达到容量上限时
    • 创建新数组(容量翻倍)
    • 复制原有元素到新数组
    • 替换引用
  • 时间复杂度
    • 多数情况 O (1)
    • 扩容时 O (n)
  • Remove 流程
    1. 查找元素位置(通过 Equals 方法)
    2. 调用 RemoveAt 删除
  • RemoveAt 流程
    1. 检查索引合法性
    2. 通过 Array.Copy 前移后续元素覆盖目标元素
    3. 最后位置置为默认值
    4. 元素计数减 1
  • 索引器:通过this[]语法实现类似数组的访问
  • 边界检查:读写时均验证索引范围
  • 默认值处理:越界时返回类型默认值(如 null、0)

设计亮点与优化点

亮点
  1. 泛型实现:类型安全,无需装箱拆箱
  2. 动态扩容:自动管理容量
  3. 索引器支持:使用体验接近原生数组
可优化点
  1. 扩容策略
    • 当前固定倍增(×2)可能导致空间浪费
    • 可改为更灵活的策略(如增长因子)
  2. 异常处理
    • 越界时仅返回默认值,建议抛出IndexOutOfRangeException
  3. 方法完善
    • 缺少ContainsIndexOf等实用方法
    • 未实现IEnumerable<T>接口
  4. 并发安全
    • 多线程环境下需要添加同步机制

相关文章:

  • yaklang 中的各种 fuzztag 标签及其用法
  • SOC-ESP32S3部分:36-适配自己的板卡
  • 【python深度学习】Day 48 PyTorch基本数据类型与操作
  • MySql读写分离部署(一主一从,双主双从,Mycat)
  • 用于机器学习的 Podman 简介:简化 MLOps 工作流程
  • javaSE复习(7)
  • LeetCode 2894.分类求和并作差
  • 基于51单片机的花样流水灯
  • 6个月Python学习计划 Day 17 - 继承、多态与魔术方法
  • 程序问题实录
  • Python BeautifulSoup解析HTML获取图片URL并下载到本地
  • 【电路】阻抗匹配
  • 云原生架构赋能企业数字化转型:从理念到落地的系统性探索
  • springboot3.5整合Spring Security6.5默认密码没有打印输出控制台排查过程
  • BeanFactory 和 FactoryBean 有何区别与联系?
  • 在vs2022中的program.cs中已经没有app.useEndpoints
  • 分词算法总结:不同分词算法的优点和缺点
  • K8S认证|CKS题库+答案| 8. 沙箱运行容器 gVisor
  • 从入门到实战:AI学习路线全解析——避坑指南
  • AUTOSAR实战教程--开放式通用DoIP刷写工具OpenOTA开发计划
  • 做外贸b2b网站/无锡百度关键词优化
  • 农业网站建设/线上销售渠道有哪些
  • 邢台集团网站建设/八百客crm登录入口
  • 做企业网站一般多少钱/百度公司官网入口
  • 网站开发方式有/网站死链检测工具
  • 免费软件看电视剧/企业网站seo案例