集合和数组的区别
数组用于保存固定数量的数据,定长,占用内存少,遍历速度快;
集合保存的数据数量,可以在程序的执行过程中,不断发生变化,不定长,占用内存多,遍历速度慢;
在功能上,数组能实现的所有功能,集合都能实现;反之,集合能实现的某些功能,数组难以实现。
下面以List集合为例,具体说明集合与数组的区别:
定义的格式
集合:List <数据类型> 变量名;
List classList;
数组:数据类型 [ ] 变量名;
int[] arr;
赋值
集合:变量名 = new List <数据类型> ( );
集合是不定长的,所以赋值时无须制定长度,赋值后长度可以变化。数组:变量名 = new 数据类型 [长度];
由于数据的定长性,所以赋值时必须指定长度,赋值后长度固定不变
初始化器
集合: 变量名 = new List <数据类型> { 元素1,元素2,... ...,元素n };
数组: 变量名 = new 数据类型 [ 长度 ] {元素1,元素2,... ...,元素n};
数据类型 [ ] 变量名 = {元素1,元素2,... ...,元素n};
数组初始化器的简化写法,不适用于集合。
由于集合不定长性,集合可以添加、插入、删除、修改元素,还可获取元素数量,以List集合为例分别说明:
- 添加元素
变量名.Add (要添加的数据); 其中添加的数据类型必须与集合定义时规定的元素类型一致
- 插入元素
变量名.Insert(索引,要插入的数据);向集合中制定的索引位置,插入一个新的元素
- 删除元素
变量名.RemoveAt(索引); 删除制定索引位置的元素变量名.Remove(数据); 删除集合中与填写的数据相同的第一个匹配项ps:添加、插入、删除元素后,集合的索引将自动重新编排
- 修改元素
变量名. [索引] = 值; 读取和修改元素与数组的操作方法完全一致
- 获取元素数量
集合: 变量名.Count数组:变量名.Length
数组:数组是相同数据类型的元素按一定顺序排列的集合。
优点:数组在内存中是连续存储的,所以可以快速而且容易的从头到尾遍历元素。对于数组赋值以及修改数组中的值也是非常简单的。
缺点:但是数组有一个很大的不足就是,在声明数组的时候必须声明指定长度的数组,所以数组适合于实现已经确定的数据数量的情况。否则就可能会造成声明的长度过长导致内存空间浪费,过段则造成数据的溢出。而且再两个数据中间插入数据也是非常麻烦的,需要将插入位置后面的数组全都移动位置。
为了克服这些缺点,就引出了集合的概念。.NET Framework中提供了用于数据存储和检索的专用类,这些类统称为集合。
ArrayList ArrayList是命名空间System.Collections下的一部分,在使用该类时必须进行引用,同时继承了IList接口,提供了数据存储和检索。ArrayList对象的大小是按照其中存储的数据来动态扩充与收缩的。所以,在声明ArrayList对象时并不需要指定它的长度。
它是使用大小可按需动态增加的数组实现IList接口(定义了很多集合使用的方法)。所以ArrayList的初始容量为0,随着元素添加进来,容量就会根据需要重新分配。
优点:ArrayList可以根据使用大小按需动态增加,不用事先设置其大小的控制,还可以随意地添加、插入或移除某一范围元素,比数组要方便。缺点:但是ArrayList不是类型安全的,它把插入值类型的数据都当做object类型,当调用数据的时候就可能会出现类型不匹配的错误。所以ArrayList存放值类型的数据时就需要进行装箱拆箱的操作,但是这项操作需要进行大量的计算也就带来了很大的性能损耗。
using System.Collections;
//增加命名空间
public partial class Form1:Form
{
IList arrayAnimal;
//动物报名按钮事件
private void button3_Click(object sender,EventArgs e)
arrayAnimal=new ArrayList();
arrayAnimal.Add(new Cat("喵喵"));
arrayAnimal.Add(new Cat("咪咪"));
arrayAnimal.RemoveAt(1);
//喵喵退出
}
装箱:把值类型打包到object引用类型的一个实例中。
//整型变量i被装箱并复制给对象o
int i=123;
object o=(object) i;
拆箱:从对象中提取值类型。
//对象O拆箱并将其赋值给整型变量i
o=123;
i=(int)o;
由于ArrayList存在的问题,C#在2.0版之后推出了新的技术来解决这些问题------泛型。
ArrayList list1 = new ArrayList();
//新增数据
list1.Add("cde");
list1.Add(5678);
//修改数据
list[2] = 34;
//移除数据
list.RemoveAt(0);
//插入数据
list.Insert(0, "qwe");
从上面例子看,ArrayList好像是解决了数组中所有的缺点,为什么又会有List?
【集合和数组的区别】从上面的例子看,在List中,我们不仅插入了字符串cde,而且插入了数字5678。这样在ArrayList中插入不同类型的数据是允许的。因为ArrayList会把所有插入其中的数据当作为object类型来处理,在我们使用ArrayList处理数据时,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。
装箱与拆箱的概念:
简单的说:泛型List 泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作他所存储的对象的占位符;类型参数作为其字段的类型和其方法的参数类型出现。
装箱: 就是将值类型的数据打包到引用类型的实例中. 比如将string类型的值abc赋给object对象obj
拆箱:就是从引用数据中提取值类型. 比如将object对象obj的值赋给string类型的变量i
说白了就是在IList和List后面添加了
List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。
List list = new List();
//新增数据
list.Add(“abc”);
//修改数据
list[0] = “def”;
//移除数据
list.RemoveAt(0);
HashTable 是一种数据结构,通过键(key)和值(value)来组织的。访问HashTable元素是可以通过键名来获取具体值,但是由于值类型也被转化为object类型,所以得到一个值类型时也需要转化,进行拆箱装箱操作。
泛型集合(Dictionary
总结: 数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List
数组可以具有多个维度,而 ArrayList或List
在决定使用List
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 图书集合完毕
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理