【转载】每天5分钟用C#学习数据结构(2)顺序表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【转载】每天5分钟用C#学习数据结构(2)顺序表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2824字,纯文字阅读大概需要5分钟。
内容图文
![【转载】每天5分钟用C#学习数据结构(2)顺序表](/upload/InfoBanner/zyjiaocheng/631/82aa16bc54c844f7a3b80a5032cd511a.jpg)
上一篇介绍了线性表是个啥玩意及两种不同的存储方式,这一篇我们来看看如何使用我们最熟悉的C#语言来实现线性表中的顺序表。
1. 静态顺序表实现:数组
在日常编程中,在处理一组数据时,最常使用的数据类型就是数组。毫不犹豫地说,数组是线性表的顺序存储结构在程序语言中最直接的表现形式。
数组是最基础也是存取速度最快的一种集合类型,在.NET中它是引用类型,也就是说它所需的内存空间会在托管堆上分配,一旦数组被创建,其中的所有元素会被初始化为它们的默认值。
另外需要注意的是,当数组元素为值类型时,数组对象存放的是值类型对象本身。而当元素为引用类型时,数组对象存放的则是对象的引用(指针)。
(1)数组元素为值类型时:
下图展示了上面的数组arrInt在内存(这里如未说明都指在.NET中的内存分配)中的分配形式,可以看到值类型数组在被创建的同时就拥有了默认值0。
(2)数组元素为引用类型时:
下图则展示了上面的数组arrCtrl在内存中的分配,可以看到在托管堆中划分了一块能够存放5个指针的内存区域,并且每个元素都被初始化为null。如果某个元素被赋值,那么会存放一个指向实际对象存储区域的指针。
小结
数组优点很多,缺点也很明显:在实际编程中,无法动态改变集合的大小。
2. 动态顺序表实现:动态数组
如果需要动态地改变数组所占用的内存空间的大小,则需要以数组为基础做进一步的抽象以实现这个功能。在C#中,ArrayList被称为动态数组,它的存储空间可以被动态地改变,同时还有添加、删除元素的功能。
ArrayList:简单好用但不是类型安全的
(1)Add:添加新元素
可以看到,在添加新元素时会进行数组容量的判断,如果达到最大值则会调用方法动态调整数组大小。
(2)RemoveAt:移除指定元素
可以看到,在移除老元素时会进行大量的元素移动操作。这里的ArrayList采用的元素类型是object,所以最后将空出的元素置为null。
(3)EnsureCapacity:动态调整数组大小
事实上,内存空间一旦分配是没有办法更改大小的。ArrayList其实使用“搬家”的方法来实现这个功能的,即当房子住不下这么多人的时候,那么换一个更大的新房子就行了。这里,ArrayList需要扩容时,会在内存空间中开辟一块新区域,容量为原来的2倍,并把所有元素都复制到新内存空间中。
泛型版本:List
由于ArrayList实际存放的是object对象(在.NET中object是万物之宗,即所有类型的父类),在进行存取操作时需要进行大量的装箱和拆箱操作(如果你不知道装箱和拆箱,那么请阅读.NET中六个重要的概念),降低程序性能。于是,从.NET 2.0开始便出现了泛型版本的List
可以看到,在集合创建的时候就把元素类型限定为int类型,它是安全的,并且还避免了装箱和拆箱操作。因此,在实际编程中一般都会使用List
3. .NET中的ArrayList与List
在.NET中已经为我们提供了两个强有力的顺序表结构类型,我们可以通过Reflector反编译工具来查看其具体实现。
ArrayList的实现
通过查看源码,我们可以发现,ArrayList关键就在于EnsureCapacity方法动态地调整数组大小。
List的实现
通过查看源码,我们也可以发现,List
4. 小结
本文介绍了线性表中的顺序表在.NET中的具体实现方式:数组、ArrayList与List
[转载:每天5分钟用C#学习数据结构(2)顺序表](Edison Zhou)
内容总结
以上是互联网集市为您收集整理的【转载】每天5分钟用C#学习数据结构(2)顺序表全部内容,希望文章能够帮你解决【转载】每天5分钟用C#学习数据结构(2)顺序表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。