集合和数组的区别

数组用于保存固定数量的数据,定长,占用内存少,遍历速度快;

集合保存的数据数量,可以在程序的执行过程中,不断发生变化,不定长,占用内存多,遍历速度慢;

在功能上,数组能实现的所有功能,集合都能实现;反之,集合能实现的某些功能,数组难以实现。

下面以List集合为例,具体说明集合与数组的区别:

定义的格式


集合:List <数据类型> 变量名; List<OneClass> classList;

数组:数据类型 [ ] 变量名; int[] arr;

赋值


集合:变量名 = new List <数据类型> ( );  集合是不定长的,所以赋值时无须制定长度,赋值后长度可以变化。

数组:变量名 = new 数据类型 [长度]; 由于数据的定长性,所以赋值时必须指定长度,赋值后长度固定不变

初始化器

集合: 变量名 = new List <数据类型> { 元素1,元素2,... ...,元素n };

数组: 变量名 = new 数据类型 [ 长度 ] {元素1,元素2,... ...,元素n};

数据类型 [ ] 变量名 = {元素1,元素2,... ...,元素n};  数组初始化器的简化写法,不适用于集合。

由于集合不定长性,集合可以添加、插入、删除、修改元素,还可获取元素数量,以List集合为例分别说明:

  1. 添加元素
变量名.Add (要添加的数据); 其中添加的数据类型必须与集合定义时规定的元素类型一致
  1. 插入元素
变量名.Insert(索引,要插入的数据);  向集合中制定的索引位置,插入一个新的元素
  1. 删除元素
变量名.RemoveAt(索引); 删除制定索引位置的元素

变量名.Remove(数据); 删除集合中与填写的数据相同的第一个匹配项

ps:添加、插入、删除元素后,集合的索引将自动重新编排
  1. 修改元素
变量名. [索引] = 值; 读取和修改元素与数组的操作方法完全一致
  1. 获取元素数量
集合: 变量名.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不是类型安全的。在存储或检索值类型时通常发生装箱和取消装箱操作,带来很大的性能耗损。

装箱与拆箱的概念:

简单的说:

装箱: 就是将值类型的数据打包到引用类型的实例中. 比如将string类型的值abc赋给object对象obj

拆箱:就是从引用数据中提取值类型. 比如将object对象obj的值赋给string类型的变量i

泛型List

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作他所存储的对象的占位符;类型参数作为其字段的类型和其方法的参数类型出现。

说白了就是在IList和List后面添加了<T>,T就是需要指定的集合的数据或对象类型。

List类是ArrayList类的泛型等效类,它的大部分用法都与ArrayList相似,因为List类也继承了IList接口。最关键的区别在于,在声明List集合时,我们同时需要为其声明List集合内数据的对象类型。

List<string> list = new List<string>();  
  
//新增数据  
list.Add(“abc”);  
  
//修改数据  
list[0] = “def”;  
  
//移除数据  
list.RemoveAt(0);   
HashTable

是一种数据结构,通过键(key)和值(value)来组织的。访问HashTable元素是可以通过键名来获取具体值,但是由于值类型也被转化为object类型,所以得到一个值类型时也需要转化,进行拆箱装箱操作。

泛型集合(Dictionary<K,V>)

具有泛型的全部特性,存储数据的方式和HashTable类似,通过键和值保存元素的。它在编译时需要检查类型的约束,获取元素是无需类型转换,所以在读取值类型数据的时候就不需要进行装箱、拆箱的操作。

总结:

数组的容量是固定的,您只能一次获取或设置一个元素的值,而ArrayList或List<T>的容量可根据需要自动扩充、修改、删除或插入数据。

数组可以具有多个维度,而 ArrayList或List<T>始终只具有一个维度。但是,您可以轻松创建数组列表或列表的列表。特定类型(Object 除外)的数组 的性能优于ArrayList的性能。这是因为ArrayList的元素属于Object类型;所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List<T> 的性能与同类型的数组十分相近。

在决定使用List<T> 还是使用ArrayList(两者具有类似的功能时,记住List<T>类在大多数情况下执行得更好并且是类型安全的。如果对List<T> 类的类型T使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 一、集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map;两者的区别: 1、Col...
    程序员欧阳阅读 11,507评论 2 61
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,357评论 0 4
  • 集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。 集合特点:1...
    骇客与画家阅读 883评论 1 0
  • 学校里面有一家新食堂开业,和同学去吃了一下,还不错。 吃完饭两个人又延着小河消消食,越发觉自己学校漂亮,天然与雕...
    忽尔今至阅读 114评论 0 0
  • 关键字 美剧 未来 PM2.5 85 美剧 开始每天记录 PM2.5 开始,一直是良。这已经是第三天了。这两天每天...
    我是老驴阅读 148评论 0 0